我们平时,是从子线程向主线程发消息,而主线程默认已经帮我们完成了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();
复制代码
// 最后,退出队列,不然会内存泄漏的
@Override
protected void onDestroy() {
super.onDestroy();
if (mLooper!=null) {
mLooper.quit();
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END