异步优化详解
创建线程,创建线程池
Executors.newFixedThreadPool()//设置线程数量,参考AsyncTask
问题1.任务必须执行在主线程当中(不符合异步要求)
解决办法:把任务改造成可以在子线程中执行,或者把任务放到主线程执行
问题2.异步任务结束时间晚于调用时机(需要在某个阶段完成)
解决办法:使用java的CountDownLatch锁
问题3:CPU密集型任务,IO密集型任务
异步优化痛点
1.代码不够优雅
2.场景不好处理(依赖关系)
3.维护成本高
启动器流程
代码Task化,启动逻辑抽象为Task
根据所有任务依赖关系排序生成一个有向无环图
多线程按照排序后的优先级依次执行
启动器流程图
延迟初始化方案
new Handler().postDelayed
Feed展示后调用
优化方案代码:
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);
}
}
执行时机明确
缓解Feed卡顿
总结
真正提升用户体验