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.创建了Looper对象,然后Looper对象中创建了MessageQueue
* 2.并将当前的Looper对象跟当前的线程(子线程)绑定ThreadLocal
*/
Looper.prepare();//队列准备
- 执行死循环
/**
* 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();
}
}