美文网首页Android
Android Handler之从主线程往子线程发消息(一)

Android Handler之从主线程往子线程发消息(一)

作者: 王魔王 | 来源:发表于2019-05-15 14:32 被阅读157次

网上有关Handler机制的文章已经不能用汗牛充栋来形容了,然而每次看的时候总觉得少了点什么,只好自己写一下自己对Handler的理解,欢迎各路大神拍砖。

一、Handler机制是什么?

答:Handler机制是Android中用于线程间通信一套通信机制。

二、为什么是Handler?Handler机制为什么被那么多次的提及?

答:从Android4.0开始,Android中请求网络强制不允许在主线程中操作,而更新UI的操作由不允许在子线程中更新UI。当我们的码农在子线程中请求网络,拿到服务器返回的数据之后,要更新UI。由于系统的要求,势必会产生一种矛盾:数据在子线程,更新UI要在主线程。此时我们必须要把数据返回到主线程中才行,Handler机制应运而生。
在问题一中我们知道了Handler是一套线程间通信机制,由于Android系统的要求,所以经常被用于更新UI。
总结一下:Handler机制是Android中一套用于线程间通信的机制,只不过经常被我们用于更新UI

三、怎么从子线程发消息到主线程

示例代码如下:

//在主线程中初始化Handler
  private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        //在此处处理消息
        }
    };


 Thread thread = new Thread(){
            @Override
            public void run() {
                super.run();
                //在子线程中发送消息
                handler.sendEmptyMessage(0);
            }
        };
  thread.start();

额,这个大家都会,写在这里是为了承上启下,抛自己的砖,引自己的玉

四、怎么从主线程发送消息到子线程?(虽然这种应用场景很少)

示例代码

  Thread thread = new Thread(){
            @Override
            public void run() {
                super.run();
                //初始化Looper
                Looper.prepare();
                //在子线程内部初始化handler即可,发送消息的代码可在主线程任意地方发送
                handler=new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                      //所有的事情处理完成后要退出looper,即终止Looper循环
                        //这两个方法都可以,有关这两个方法的区别自行寻找答案
                        handler.getLooper().quit();
                        handler.getLooper().quitSafely();
                    }
                };
              
                //启动Looper循环
                Looper.loop();
            }
        };
        thread.start();

上述代码中,在初始化handler前后均有两句关键代码,一定不能遗忘,否则你会收到以下异常

Can't create handler inside thread " + Thread.currentThread()+ " that has not called Looper.prepare()

读者先记住,下文会解释

五、handler的执行逻辑,即handleMessage()方法的执行逻辑,到底是在子线程还是主线程?

结合示例三和示例四总结,似乎handleMessage()的执行线程就是handler初始化时所在的线程,那么答案真的是这样的吗?
答案是否定的!!!
一切答案,都在源码中。
在看源码之前,我们先来回答一下这几个问题

1、简述Handler机制
2、Handler是怎么实现切换线程的?
3、handler.sendMessage()与handler.post()的区别
3、Handler为什么会引起内存泄漏,解决方式是什么
4、Looper是怎么取消息的?
5、MessageQueue是怎么增删消息的?
6、一个线程可以有几个Handler?几个Looper?几个MessageQueue?
7、A Handler发送的消息为什么不会跑到B Handler的handleMessage()方法中?
A Handler发送的消息究竟是怎么回到A Handler自身的handleMessage()中的?
8、Looper的Loop()方法到底是不是阻塞操作?如果是?主线程的Looper为什么没有阻塞主线程?如果不是,那你怎么解释Looper.loop()方法?
9、简述ThreadLoacal的原理

如果你能完美回答出上面9个来自灵魂的拷问,那么请自动忽略本系列博客

欢迎关注我的公众号

相关文章

  • Android Handler之原理解析

    续上篇Android Handler之从主线程往子线程发消息(一) 简单回顾一下Handler机制中几个对象的主要...

  • android线程间通信

    android线程间通信四种方式: 1,通过Handler机制 主线程中定义Handler,子线程发消息,通知Ha...

  • Android Handler之从主线程往子线程发消息

    网上有关Handler机制的文章已经不能用汗牛充栋来形容了,然而每次看的时候总觉得少了点什么,只好自己写一下自己对...

  • Android Handler之从主线程往子线程发消息(一)

    网上有关Handler机制的文章已经不能用汗牛充栋来形容了,然而每次看的时候总觉得少了点什么,只好自己写一下自己对...

  • Android---线程间通讯

    1. Handel:主线程中定义Handler,子线程发消息,通知Handler完成UI更新,Handler对象必...

  • 线程间通信 Thread+handler

    前言:主线程和子线程的相互交互: 一、子线程向主线程发消息(Thread+handler): 1、主线程中定义Ha...

  • android整理之handler源码解析

    Handler handler机制提供主线程与主线程的通讯,主线程与子线程之间可以互发消息进行相应的数据UI更新。...

  • Handler原理解析

    Handler可以理解为线程间收发消息的处理器。在Android中最常见的应用场景是子线程使用主线程的Handle...

  • Handler 测试题

    Handler 测试题 一,判断是否执行在子线程中 实际结果却是main 二,主线程如何给子线程发消息 主线程持有...

  • Android源码解析之android异步任务AsyncTask

    我们都知道通过Handler可以实现异步任务,子线程通过Handler发消息给主线程,然后主线程执行相应的操作。在...

网友评论

    本文标题:Android Handler之从主线程往子线程发消息(一)

    本文链接:https://www.haomeiwen.com/subject/kiypdqtx.html