常规方案
New Handler().postDelayed
Feed展示后调用
常规初始化痛点
时机不便控制
导致Feed卡顿
更优方案
核心思想:对延迟任务进行分批初始化
利用IdleHandler特性,空闲执行
public class DelayInitDispatcher {
private Queue<Task> mDelayTasks = new LinkedList<>();
private MessageQueue.IdleHandler mIdleHandler = new MessageQueue.IdleHandler() {
@Override
public boolean queueIdle() {
if(mDelayTasks.size()>0){
Task task = mDelayTasks.poll();
new DispatchRunnable(task).run();
}
return !mDelayTasks.isEmpty();
}
};
public DelayInitDispatcher addTask(Task task){
mDelayTasks.add(task);
return this;
}
public void start(){
Looper.myQueue().addIdleHandler(mIdleHandler);
}
}
public void onFeedShow() {
// 以下两行是原有方式
// new DispatchRunnable(new DelayInitTaskA()).run();
// new DispatchRunnable(new DelayInitTaskB()).run();
DelayInitDispatcher delayInitDispatcher = new DelayInitDispatcher();
delayInitDispatcher.addTask(new DelayInitTaskA())
.addTask(new DelayInitTaskB())
.start();
}
优点
执行时机明确
缓解Feed卡顿