主要使用方法
sendMessage(message)//发送消息
sendMessageDelayed(message, time)//延时发送消息
new Handler(){
handleMessage(Message msg){}//接收msg
}
post(runable)//主线程中更新UI
postDelayed(runable, time)//延时主线程中更新UI
obtainMessage//获得handler中的message返回一个新的message//sendToTaget()同sendMessage()
移除removeCallbacks,removeMessages
new Handler(new Callback(){
handleMessage(Message msg){}//在callback拦截消息,若return true 则Handler中的handleMessage不再执行
})
为什么主线程才能更新UI?
多线程并发,循序更新UI,不会错乱,易于开发
Handler负责发送消息,封装发送消息方式和目标。
Looper时消息的载体,包含一个MessageQueue容器,Looper.looper无限循环获取消息,没有则阻塞,并返回消息给Handler
线程同步HandlerThread//下载网络图片,更新数据库信息(耗时)
HandlerThread handlerThread = new HandlerThread();//在loop为空时会getLooper等待直到创建后才完成
new Handler(handlerThread.getLooper());
更新UI的方式
1)handler.sendMessage()//handler最常用的方法
2)handler.post(runnable)//本质时发送message,runnable作为callback
3)activity.runOnUiThread(runnable)//调用activity的handler线程执行post
4)view.post(runnable)//ViewRootImpl.获取handler
非UI线程更新ui
在onCreate中的线程直接更新ui。原理,对于线程更新ui的验证类接口ViewRootImpl的初始化时在onResume中进行的,故在onCreate线程中直接更新ui有可能成功。onResume执行之后(比如线程耗时操作了)则会报错。