Android Handler学习总结

来源:互联网 发布:淘宝牛仔裤女店铺推荐 编辑:程序博客网 时间:2024/05/17 22:34

有哪些方法加入到主UI线程中运行

1.Activity.runonUiThread(Runnable)

2.View.post(Runnable); View.postDelay(Runnable,long)

3.Handler

4.AsyncTask

Handler的作用

1.执行计划任务,你可以在预定的实现执行某些任务,可以模拟定时器

2.线程间通信。在Android的通信启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息。当你创建子线程时,你可以在你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其他线程中更新界面。



3)确保操作始终在某个特定的线程中运行。例如当我们从数据库加载数据时,除了程序启动时需要加载外,每当我们接收数据改变时也需要重新加载。为了确保数据的有效性(始终使用最后一次查询得到的数据),并减小不必要的查询操作,我们应当确保他们在同一个线程中运行。

角色描述

1.Looper:(相当于隧道) 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(车队,消息隧道)

2.Handler:你可以构造Handler对象来与Looper沟通

3.Message Queue(消息队列):用来存放线程放入的消息

4.线程:UI thread通常是main thread,而Android启动程序时会替它建立一个Message Queue


Looper的实现:


当前线程有一个Looper这样的循环在监听消息队列,这是一个死循环,主线程好像可以不用管Looper,其他逻辑代码可以照常往下走,但这个又不是而外的线程,这不是和我们学习的常理相悖么?
Looper由系统控制的循环。在我们的线程没有新开,但是在系统里面vm会有


其实Looper的实现和Windows编程的消息机制非常相似

对于正在执行的Message,调用removeMessage会有什么后果?

1.调用removeMessage移除一个还没有开始执行的message,看看会有什么效果?

那么这个message就不会执行了

2.移除一个正在执行的message,观察有什么效果

 这个message如果被处理了,移除就没有效果了


Handler其实很简单

1.Handler实例与消息处理是关联的,发送和接收要匹配

2.只能依附在HandlerThread

3.可以通过设置Looper来选择依附的线程

4.所有的操作都是在同一个线程中

5.removeMessage只能移除队列中的Message

6.如果只通过Handler.post()方法将线程压入队列时,直接调用的是线程的run()方法,则主线程和调用的线程处于

同一个线程中。


同一个HandlerThread可以有多个Handler么? Yes

同一个HandlerThread中使用多个Handler Message会混淆么? 为什么?

 No 每一条消息都有一个target字段,这个target字段就标识了是哪个handler



考核目标

1.使用Handler是异步的,它会建立新线程吗?

No 依附在线程的Looper中

2.Handler是在主线程内?

  不一定 可以通过Looper选择依附的线程

3.Handler的post和sendMessage方法,使用的是一个队列还是两个 

  1个

4.子线程建立一个Handler,然后sendMessage会怎样

   报错

5.Handler中不同的消息有可能被同时处理吗?

   不可能 因为他们运行在同一个线程中

6.当Handler在处理消息时,如果收到removeMessage(),会中断这个处理么?

  不会

原创粉丝点击