Handler作用:将任务逻辑切换到Handler所在的线程中
使用方式:
核心思想,在一个线程发送消息,在另一个线程接受消息并处理。
发送消息的线程一般不能进行一些耗时的作业,所以交由另一个线程(处理消息的进程)进行处理。
Handler:和looper进行交流, sendmessage时发送消息时将消息存到messagequque中了 按照时间状态。处理looper从messagequeueu取出的事件分发给handler采用callback方式runnble的Run处理了,或者采用handler的handlerMessage方法处理。
Looper:循环消息队列,构造方法中构造了一个messagequeue.(是个共享容器可存可取)内涵循环不断取出消息
messagequeue:采用先进先出的方式存储message
message: 通过设定 obj, what ,等字段存储并运输消息,messege 本质是个单链表,用完回收。(属性值清空)
注意主线程 即UI线程中 系统已经初始化了一个Looper. 所以我们在主线程中处理消息(主线程中一般处理UI更新方面的消息)直接创建Handler对象并覆写Handler处理消息的方法即可。
而 子线程即自己创建的线程,如果作为处理消息的进程,则我们需要进行以下处理:
1调用Looper的prepare()方法为当前进程创建Looper对象()创建对象的同时构造器方法会 自动创建MessageQueue。
2创建Handler对象,并覆写Handler处理方法。用来处理其他线程发送的消息。
3调用Looper的loop方法启动looper.
细节心得:其中massge对象常与bundler连用 进行数据的发送,匹配消息时用msg.what 标记进行匹配。将子线程定义在内部类中方便查找子线程的handler.
Message ms= mhandler.obtainMessage();
ms.what = SEND_ROCK;
ms.sendToTarget();//这种Masage方式减少内存开销。子线程中Handle创建r:
class MyThread extends Thread{
Handler threadHandler;
@Override
public void run() {
Looper.prepare();
threadHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 0x11:
threadHandler.removeMessages(threadSendMsg);
synchronized (pagerThread){
try {
pagerThread.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
break;
case 0x12:
if (flag){
threadHandler.sendEmptyMessageDelayed(threadSendMsg,5000);
handler.sendEmptyMessage(changePage);
}
break;
case 0x13:
threadHandler.sendEmptyMessageDelayed(threadSendMsg,5000);
break;
}
}
};
threadHandler.sendEmptyMessageDelayed(threadSendMsg,5000);
Looper.loop();
}
}并不断发送消息给自己 ,达到定时给主线程的Handler发送消息的逻辑。
注意:导包是 os.handler包!!
工作原理:
创建流程:
MessageQueue和Looper 协同工作:
Looper阻塞对子线程的影响和处理:
Handler post和send 消息的本质:
Looper对消息的处理:
Handler处理消息的过程:
Thread mmTread=new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Handler.Callback callback;
callback=new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return false;
}
};
Handler handler =new Handler(callback);
//第二个构造方法绑定一个Looper
//Handler handler=new Handler(Looper.myLooper());
Looper.loop();
//获取当前线程的Looper对像,并退出让这个线程停下来。
Looper.myLooper().quit();
}
});通过绑定callback 就不会派生Handler子类。
本文深入解析了Android中的Handler机制,包括其工作原理、消息传递过程及如何在主线程和子线程中正确使用。
309

被折叠的 条评论
为什么被折叠?



