android视频教程

android视频教程

5 (13人评价)
  • 课时:(26)

  • 学员:(409)

  • 浏览:(15203)

  • 加入课程

android视频教程17的笔记

相关课时: 笔记详情:

三个大实验,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操作主线程消息队列。

 

0 0

你感兴趣的课程

8万+浏览/ 916学员/ 4.5评分
免费
6万+浏览/ 177学员/ 5评分
免费
6万+浏览/ 973学员/ 4.8评分
免费