Handler
Android多线程机制
Handler:
一个单线程循环队列,效率高,不这样做就要加好多锁
在某个指定线程执行代码,java想这么做,只能内部循环检查才可以
Looper成员:sThreadLocal = new ThreadLoacal
Looper.prepare: sThreadLocal.set(new Looper(quitAllowed)) threadLocal可以让每个线程都有自己的looper
Looper.loop:
死循环
Message msg = queue.next()
msg先查看自己有没有callback就是runnable,没有再看handleMessage
怎么排序的
msg里有when字段,表示期望时间,systemclock.uptimeMillis() + delayMillis()
如何提升优先级
sendMessageAtFrontQueue,该方法就是把msg的时间设置为0,这样会插入队列最前
主线程死循环为何不会导致ANR
所有主线程的操作其实都在这个循环内,anr也是这个循环内阻塞才会有
没有消息会阻塞怎么恢复
epoll机制
sendMessage或post
同步屏障
字面意思就是给同步消息设置屏障,优先执行异步消息,设置后next会忽略所有同步消息
messageQueue.postSyncBarrier,就是系统发送的更新UI请求,优先级最高,会停掉其他非同步msg
IdleHandler:
主线程空闲才会调用的handler
如何实现的消息延时
当next取消息时,取出消息的when时间还不够,会阻塞队列,直到时间到达时唤醒或有新的消息进入
AsyncTask:
内存泄漏:内存中的对象由于被引用,导致它应该被回收时没有被正确的回收
内部类持有外部类引用,gc root不会回收正在执行的线程,导致持有的外部类也不会被回收
如果时间很短,内存泄漏时间少,影响不大
区别
thread
excutor
asynctask
HanderThread:自带loop的thead
IntentService:HanderThread和service的结合