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

1.关键代码:

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();

发送消息代码:

subHandler.obtainMessage(2,"你好,主线程,我是子线程").sendToTarget();

2.过程:

1.子线程的生命周期:

run()方法执行完了,就意味着子线程的生命周期结束

new Thread(new Runnable() {
    
    
            @SuppressLint("HandlerLeak")
            @Override
            public void run() {
    
    //这个就是run()方法
                
                Log.d(TAG, "run: loop()执行完了");
            }
        }).start();

2.问题:

子线程一执行就会执行完run()方法,也就是说子线程生命周期直接结束,结束了,我们怎么发送消息

3.问题解决:

将子线程保活:怎么做呢?

  1. 创建队列,
/**
                 * 1.创建了Looper对象,然后Looper对象中创建了MessageQueue
                 * 2.并将当前的Looper对象跟当前的线程(子线程)绑定ThreadLocal
                 */
                Looper.prepare();//队列准备
  1. 执行死循环
/**
                 * 1.从当前线程中找到之前创建的Looper对象,然后找到MessageQueue
                 * 2.开启死循环,遍历消息池中的消息
                 * 3.当获取到msg的时候,调用这个msg的handler的disPatchMsg方法,让msg执行起来
                 */
Looper.loop();

这样子线程就保活了
在这里插入图片描述

4.主线程向子线程发送消息

在子线程的循环里创建Handler对象,等待接收消息

subHandler = new Handler(){
    
    
                    @Override
                    public void handleMessage(@NonNull Message msg) {
    
    
                        Log.d(TAG, "handleMessage: "+msg.toString());
                        Toast.makeText(MainActivity.this, "主线程:"+msg.obj.toString(), Toast.LENGTH_SHORT).show();
                    }
                };

主线程执行消息发送:

subHandler.obtainMessage(2,"你好,主线程,我是子线程").sendToTarget();

5.最后,退出队列,不然会内存泄漏的

@Override
    protected void onDestroy() {
    
    
        super.onDestroy();
        if (mLooper!=null) {
    
    
            mLooper.quit();
        }
    }

猜你喜欢

转载自blog.csdn.net/sunweihao2019/article/details/109311728