三个大实验,5个小实验。
一、验证子线程中用主线程Handler实例操作主线程的MessageQueue。
Handler1.sendMessage,Handler1接收
Handler1.sendMessage,Handler2能接收吗?---no.同一个线程的同一个消息队列,不同的handler实例,彼此之间发送和接收消息是相对独立的,消息体的what属性来标示。
主线程就一个消息队列,为什么不同Handler实例之间不能共享消息(what flag)
二、验证用子线程默认是没有消息队列的
子线程中new Handler(),发消息----发生异常,log提示子线程无looper实例,不能发消息。
子线程中用HandlerThread,默认有消息队列---可以发消息。官方提供的特殊线程。
HandlerThread子类中,run方法中
Looper lp = this.getLooper();
new Handler(lp){
handlerMessage ...
}.sendMessage(...);
使用lp就可以发消息了。
HandlerThread在继承Thread基础上加入looper和handler的一些特性。
三、子线程的Handler可以使用子线程的消息队列
子线程中得到主线程的looper,发消息。
子线程的run方法中:
Handler lab3Handler;
lab3Handler = new Handler(Looper.getMainLooper()) {
...
};
这种用法比较少,实际意义不大。
使用Looper.prepare(),Looper.loop()。
在当前子线程建立一个消息队列,handler和消息队列都在子线程中。---实际意义更不大。
在子线程run方法中
Handler lab3Handler;
Looper.prepare();----建立一个looper的实例。
lab3Handler = new Handler(){
handleMessage ...
}
lab3Handler.sendMessage(...);
Looper.loop();
实验总结:
Handler实例与消息处理是关联的,发送和接收要匹配。(同一个handler自己发送和接收。)
Handler操作队列,主要是在子线程操作主线程消息队列。(子线程发送消息到主线程消息队列,主线程接收到后更新界面显示)
子线程默认是没有消息队列的。
使用Handler是异步的,它会建立新线程吗?---不会
handler是在主线程内吗?一般在主线程,如果建handler时构造函数传入的是子线程的looper,是会(可以)在子线程内的。
Handler的post和sendMessage方法,使用的是一个队列还是两个?一个
子线程中建立一个handler,然后sendmessage会怎样?默认情况下会抛异常;如果实例化looper后再sendMessage是可以的。
子线程建立handler,构造的时候传入主线程的looper,可以吗?可以
一般子线程用主线程handler操作主线程消息队列,涉及两个线程,实现异步,handler本身不建立新线程(post(Runnalbe)).
子线程中不能直接创建handler发消息。子线程是HandlerThread,实例化looper,传给建立handler的构造函数,这个子线程的handler才能发消息,子线程handler操作主线程消息队列。
学员评论
Dingo妹2014-07-14
你感兴趣的课程