有那些方法加入到主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(),会中断这个处理么?
不会