parent
4dc96160d4
commit
521bb3cb6c
@ -0,0 +1,87 @@ |
||||
--- |
||||
IdleHandler 原理 |
||||
--- |
||||
|
||||
1. 了解 IdleHandler 的作用以及调用方式 |
||||
2. 了解 IdleHandler 有哪些使用场景 |
||||
3. 熟悉 IdleHandler 的实现原理 |
||||
|
||||
```java |
||||
public static interface IdleHandler{ |
||||
boolean queueIdle(); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler()){ |
||||
@Override |
||||
public boolean queueIdle(){ |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
public void addIdleHandler(IdleHandler handler){ |
||||
synchronized(this){ |
||||
mIdleHandler.add(handler); |
||||
} |
||||
} |
||||
Message next(){ |
||||
for(;;){ |
||||
nativePollOnce(ptr, nextPollTimeoutMillis); |
||||
// 看消息列表是否有消息可以分发的,如果有,就返回该消息 |
||||
// 走到这说明没有消息可以分发,下一个 for 循环就要进入休眠了 |
||||
if(pendingIdleHandlerCount<0){ |
||||
pendingIdleHandlercount = mIdleHandlers.size(); |
||||
} |
||||
if(pendingIdleHandlerCount<0){ |
||||
continue; |
||||
} |
||||
mPendingIdleHandlers = mIdleHandlers.toArray(mPendingIdleHandlers); |
||||
for(int i=0;i<pendingIdleHandlerCount;i++){ |
||||
final IdleHandler idler = mPendingIdleHandlers[i]; |
||||
if(!(idler.queueIdle())){ |
||||
mIdleHandlers.remove(idler); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
``` |
||||
|
||||
Framework 哪些地方用到了 IdleHandler 呢? |
||||
|
||||
```java |
||||
// ActivityThread#scheduleGcIdler |
||||
void scheduleGcIdler(){ |
||||
if(!mGcIdlerScheduled){ |
||||
mGcIdlerScheduled = true; |
||||
Looper.myQueue().addIdleHandler(mGcIdler); |
||||
} |
||||
mH.removeMessages(H.GC_WHEN_IDLE); |
||||
} |
||||
final class GcIdler implements MessageQueue.IdleHandler{ |
||||
@Override |
||||
public final boolean queueIdle(){ |
||||
// BinderInternal.forceGc("bg"); |
||||
doGcIfNeeded(); |
||||
return false; |
||||
} |
||||
} |
||||
// ActivityThread#waitForIdle |
||||
public void waitForIdle(Runnable recipient){ |
||||
mMessageQueue.addIdleHandler(new Idler(recipient)); |
||||
mThread.getHandler().post(new EmptyRunnable()); |
||||
} |
||||
private static final class Idler implements MessageQueue.IdleHandler{ |
||||
public final boolean queueIdle(){ |
||||
if(mCallback!=null){ |
||||
mCallback.run(); |
||||
} |
||||
return false; |
||||
} |
||||
} |
||||
``` |
||||
|
||||
#### 适用场景 |
||||
|
||||
1. 延时处理 |
||||
2. 批量任务 |
Loading…
Reference in new issue