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的结合