本文由PurpleSword(jzj1993)原创,转载请注明
原文网址 http://blog.csdn.net/jzj1993


安卓主线程(UI线程)是线程不安全的:对UI控件的操作都应在主线程中完成;UI线程不应执行耗时操作,以免程序不响应(即ANR异常)
实现新线程的常用方法(注意要调用start方法启动新线程而不是run方法):
一、定义类,实现Runnable接口

    class MyRunnable implements Runnable {
        /**
         * 实现接口的run方法
         */
        @Override
        public void run() {
            // run方法的中程序体将在新线程中执行
        }

}

    new Thread(new MyRunnable()).start();
二、简洁写法
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 新线程操作
            }
        }).start();

三、定义类,继承Thread(不推荐):
    class MyThread extends Thread {
        /**
         * 覆写run方法
         */
        @Override
        public void run() {
            // 新线程操作
        }

}

    new MyThread().start();
Thread和Runnable关系
    public class Thread extends Object implements Runnable {

}

创建UI线程/主线程的Handler

一、(推荐写法,用于不处理消息,只是接收Runnable的情况下)

    // 无参数实例化时,会创建当前正在运行线程(即主线程)的Handler
    Handler handler = new Handler();
如果handler需要处理消息,按照以下写法将会产生警告This Handler class should be static or leaks might occur。此时可使用方法二)
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            }
        }

};

二、(缺点在于需要定义一个新的类,写起来比较麻烦)

    // 无参数实例化时,会创建当前正在运行线程(即主线程)的Handler
    private Handler handler = new MyHandler() {
        // 处理其他线程发送的消息
        @Override
        public void handleMessage(Message msg) {
            Log.d("msg", "msg what = " + msg.what);
            switch (msg.what) {
            }
        }
    };
    protected static class MyHandler extends Handler {

}

三、(推荐写法,可用于接收Runnable和处理消息的情况下)

    boolean handleMessage(Message msg) {
        switch (msg.what) {
        }
        return true;
    }
    private final Handler mainHandler = new Handler(Looper.getMainLooper(),

            new Handler.Callback() {
                @Override
                public boolean handleMessage(Message msg) {
                    return ActivityMain.this.handleMessage(msg);
                }

});

在UI线程中执行程序
        handler.post(new Runnable(){
            @Override
            public void run() {
                // 操作UI控件等...
            }

});

创建新线程的Handler
    private HandlerThread handlerThread;

private Handler handler;

    this.handlerThread = new HandlerThread(getClass().getSimpleName());
    this.handlerThread.start();
    this.handler = new Handler(this.handlerThread.getLooper(),
            new Handler.Callback() {
                public boolean handleMessage(Message msg) {
                    return NewThread.this.handleMessage(msg);
                }

});

    /**
     * 处理消息
     * 
     * @param msg
     * @return
     */
    private boolean handleMessage(Message msg) {
        switch (msg.what) {
        }
        return true;

}

通过Message进行线程间通信:在任意线程中向其他线程Handler发送消息
    /**
     * 向线程Handler发送消息
     * 
     * @param id
     * @param o
     */
    protected void sendMsg(int id, Object o) {
        if (handler != null) {
            Message msg = Message.obtain();
            msg.obj = o;
            msg.what = id;
            handler.sendMessage(msg);
        }

}

    /**
     * 向线程Handler发送消息
     * 
     * @param what
     */
    protected void sendMsg(int what) {
        if (handler != null) {
            handler.sendEmptyMessage(what);
        }

}

    handler.sendMessageDelayed(msg, milliseconds);
    Message.obtain(handler, what, obj).sendToTarget();
近期自己搭建了一个网站,以后我的博客会转移到个人网站,欢迎大家关注~ 网址是http://purplesword.info

安卓线程相关 HandlerThread Handler Thread Looper Message Runnable相关推荐

  1. Android多线程分析之三:Handler,Looper的实现

    Android多线程分析之三:Handler,Looper的实现 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前文<Android多线程分 ...

  2. handler回调主线程_Android使用Handler实现子线程与子线程、子线程与主线程之间通信...

    转载:https://blog.csdn.net/shaoenxiao/article/details/54561753 今天这篇文章只讲一下怎么使用Handler实现子线程与子线程之间.子线程与主线 ...

  3. Android 线程4件套 MessageQueue Message Looper Handler之Looper

    Android驱动线程消息公四件套: 消息载体:Message 消息队列:MessageQueue 消息循环:Looper 消息处理:Handler 以Looper为基础,形象的表示为一个无限循环的环 ...

  4. Android——线程通讯 Handler、Looper、Message;

    线程通讯问题 (主要用到了Handler类,Looper类和Message类以及MessageQueue) 在Android中主线程如何向子线程中发送消息的问题.让我们来想想,这其中的过程,无非就是创 ...

  5. 线程间通信: Handler , Looper, MessageQueue, Message (完结)

    概述:    为了 线程间 通信方便, Handler 机制 通过 Handler 和 Looper, MessageQueue, Message 这些 类 之间的协作, 简化 多线程的开发.  线程 ...

  6. 【转】Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask

    方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread( new Runnable() { ...

  7. Android的线程使用来更新UI----Thread、Handler、Looper、Time...

    为什么80%的码农都做不了架构师?>>>    方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码 ...

  8. Android多线程源码学习笔记一:handler、looper、message、messageQueue

    最近在学习Android多线程相关知识的源码,现在把自己的笔记整理一下,写出来加深印象. Android多线程通讯的核心是handler.looper.message.messageQueue,这篇文 ...

  9. Android 消息处理机制(Looper、Handler、MessageQueue,Message)

    原文:[简书原文](http://www.jianshu.com/p/02962454adf7)> 另外本人自己开了开了个人博客 fanmingyi.cn 不定时更新[跳转到个人博客](http ...

最新文章

  1. StaticFactoryMethod_Level4
  2. Hi3516ampp编译错误之ls: cannot access '/hiwork/osdrvhi3516a.C02': No such file or directory
  3. 由 HashMap 引发的一个面试10连炮争吵!
  4. 最长公共子序列Lcs 51Nod - 1006
  5. 第十七章 apache 性能调优
  6. SAP Spartacus Focusdirective继承自Lockdirective,静态代码分析
  7. pip更新出问题后再输入报No module named ‘pip‘错怎么处理
  8. iOS uuchart 用法
  9. 2020年数据库系统工程师下午真题及答案解析
  10. SpringBoot2.x整合Redis数据库
  11. BCNF范式的判断和分解
  12. INT 10H显示字符串的小例子
  13. EditText 去掉下划线,但是不丢失光标
  14. Spark算子:RDD行动Action操作–aggregate、fold、lookup;reduce/fold/aggregate区别
  15. kpi绩效考核流程图_KPI绩效考核的步骤
  16. 怎样使footer始终处于页面的底部
  17. PAT_乙级_1010_筱筱
  18. 《美队3》没融入VR,罗素兄弟想在“妇联3”寻找机会
  19. 自动控制原理知识点梳理——6.线性系统的校正方法
  20. 【ACM- OJ】《Oulipo》C++

热门文章

  1. 工作碎片记录-android自动化测试
  2. 关于websocket
  3. Linux服务器的架设 (DHCP,NIS,SAMBA,FTP,DNS)
  4. window.onload与$(document).ready()的区别
  5. vue.js 组件之间传递数据 1
  6. vue与php接口对接,怎样使用vue项目中api接口
  7. 杭电acm2151题java的解法,杭电ACM题型分类
  8. android 自定义帧动画,Android 自定义方式实现帧动画效果
  9. 算法训练 最小乘积(基本型) (蓝桥杯水题)
  10. php rsa加密实例,关于PHP语言的RSA加密实例讲解