有那些方法加入到主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的实现和Windows编程的消息机制非常相似
对于正在执行的Message,调用removeMessage会有什么后果?
1.调用removeMessage移除一个还没有开始执行的message,看看会有什么效果?
那么这个message就不会执行了
2.移除一个正在执行的message,观察有什么效果
这个message如果被处理了,移除就没有效果了
Handler其实很简单
1.Handler实例与消息处理是关联的,发送和接收要匹配
2.只能依附在HandlerThread
3.可以通过设置Looper来选择依附的线程
4.所有的操作都是在同一个线程中
5.removeMessage只能移除队列中的Message
同一个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(),会中断这个处理么?
不会