安卓子线程UI线程相关

首先明确一点,一个线程对应一个Looper,handler使用如下:

public class MainActivity extends AppCompatActivity {

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };
handler.jpg

我们在UI 线程构建handler的时候并没有指定Looper,其实默认的是UI线程所对应的那个MainLooperMianLooper和我们的handler一一对应,实质上我们可以在UI线程中构建多个handler,但是他们共用的是同一个Looper,也就是MainLooper,当我们调用handler.sendMessage(msg);的时候,首先将消息放入messageQuene,然后mainLooper loop到消息之后调用handlemessage方法进行处理。
如若我们想在子线程中创建出来一个handler来处理线程切换呢,之所以会写这篇笔记主要是在看EventBus源码的时候,EventBus会根据我们配置的线程指定方法在对应的线程中运行,EventBus中当我们指定一个事件发生在主线程的时候,我们会判断发送事件在某个线程,如果我们在子线程中发送到UI线程的事件,就需要做线程切换,此时就需要在子线程中构建handler,从而保证方法在UI线程中执行,以下为子线程中构建handler的代码:

new Thread(new Runnable() {  
            public void run() {  
                Handler handler = new Handler(Looper.getMainLooper()){ // 区别在这!!!!  
                    @Override  
                    public void handleMessage(Message msg) {  
                        Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();  
                    }  
                };  
                handler.sendEmptyMessage(1);  
            };  
        }).start();  

当我们再子线程中构建好handler之后就可以指定方法放生在UI 线程中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,985评论 25 708
  • Android Handler机制系列文章整体内容如下: Android Handler机制1之ThreadAnd...
    隔壁老李头阅读 8,240评论 8 57
  • 异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的消息...
    cxm11阅读 6,444评论 2 39
  • 美图欣赏 Java、Android知识点汇集 Java集合类 ** Java集合相关的博客** java面试相关 ...
    ElvenShi阅读 1,763评论 0 2
  • 1 今天忽然间发现自己的精力管理水平提高了,因为自己在工作之余,时不时地靠在椅子背上,头部后仰,经过多次这样的动...
    LiHongxi阅读 109评论 0 0