android 主线程向子线程发送消息

我们平时,是从子线程向主线程发消息,而主线程默认已经帮我们完成了Looper的操作,所以我们只需要简单的“创建一个Handler对象,然后一个线程发消息,另一个接收消息”……
我们先说一下这个Looper是神马吧。
它就像一个消息队列(MessageQueue)的管家(Looper),一个消息队列只有一个管家,并且管理者整个消息队列,而一个消息队列内可以容纳多个消息(Message),而工人(Handler)也可以有多个,管家派遣他们向消息队列中存储或取出消息后执行任务;

所以它们的个数如下:
管家(Looper): 1 个;
消息队列(MessageQueue):1 个;
消息(Message):可以多个;
工人(Handler):可以多个;

new Thread(new Runnable() {
            @SuppressLint("HandlerLeak")
            @Override
            public void run() {
                //run方法执行完,生命周期就结束了,我们主线程要给子线程发送消息,那么就要保证子线程不死
                /**
                 * 1.创建了Looper对象,然后Looper对象中创建了MessageQueue
                 * 2.并将当前的Looper对象跟当前的线程(子线程)绑定ThreadLocal
                 */
                Looper.prepare();//队列准备

                subHandler = new Handler(){
                    @Override
                    public void handleMessage(@NonNull Message msg) {
                        if (msg.what==2) {
                            Toast.makeText(MainActivity.this, "主线程:"+msg.obj.toString(), Toast.LENGTH_SHORT).show();
                        }
                    }
                };
                mLooper = Looper.myLooper();

                /**
                 * 1.从当前线程中找到之前创建的Looper对象,然后找到MessageQueue
                 * 2.开启死循环,遍历消息池中的消息
                 * 3.当获取到msg的时候,调用这个msg的handler的disPatchMsg方法,让msg执行起来
                 */
                Looper.loop();
                Log.d(TAG, "run: loop()执行完了");
            }
        }).start();


复制代码

20201027154426794.png

    // 最后,退出队列,不然会内存泄漏的
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mLooper!=null) {
            mLooper.quit();
        }
    }
复制代码

参考:blog.csdn.net/iblade/arti…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享