废话不多说,直接上代码,顺便附一张之前战斗过的地方,项目虽好,但是工作室太“简陋”,做完几个版本就溜了。。
3.聊一聊IdleHandler的优化及封装
不知道task是啥的,就去看第三章内容。
/**
- @author: lybj
- @date: 2020/5/26
- @Description: 空闲队列
*/ public class IldeTaskDispatcher {
private Queue mIldeQueue = new LinkedList<>();
private MessageQueue.IdleHandler messageQueue = new MessageQueue.IdleHandler(){
@Override public boolean queueIdle() {
if(mIldeQueue.size() > 0){
// 如果CPU空闲了, Task IldeTask = mIldeQueue.poll(); new DispatchRunnable(IldeTask).run(); } // 如果返回false,则移除该 IldeHandler return !mIldeQueue.isEmpty(); } };
public IldeTaskDispatcher addTask(Task task){
mIldeQueue.add(task); return this; }
/**
- 执行空闲方法,因为用了DispatchRunnable,所以会优先处理需要依赖的task,再处理本次需要处理的task,顺序执行
- */
public void start(){ Looper.myQueue().addIdleHandler(idleHandler); } } 复制代码
调用的话也很简单
new IldeTaskDispatcher() .addTask(new InitBaiduMapTask()) .addTask(new InitBuglyTask()) .start(); 复制代码
4.其他代码
不明白的,去看上一章的讲解,这章本来就是在上一章内容上增加的拓展
DispatchRunnable
public class DispatchRunnable implements Runnable { private Task mTask; private TaskDispatcher mTaskDispatcher;
public DispatchRunnable(Task task) { this.mTask = task; } public DispatchRunnable(Task task,TaskDispatcher dispatcher) { this.mTask = task; this.mTaskDispatcher = dispatcher; }
@Override public void run() {
Process.setThreadPriority(mTask.priority());
long startTime = System.currentTimeMillis();
mTask.setWaiting(true); mTask.waitToSatisfy();
long waitTime = System.currentTimeMillis() - startTime; startTime = System.currentTimeMillis();
// 执行Task mTask.setRunning(true); mTask.run();
// 执行Task的尾部任务 Runnable tailRunnable = mTask.getTailRunnable(); if (tailRunnable != null) { tailRunnable.run(); }
if (!mTask.needCall() || !mTask.runOnMainThread()) { printTaskLog(startTime, waitTime);
TaskStat.markTaskDone(); mTask.setFinished(true); if(mTaskDispatcher != null){ mTaskDispatcher.satisfyChildren(mTask);
// --> 8 mTaskDispatcher.markTaskDone(mTask); } } TraceCompat.endSection(); } } 复制代码
task
public abstract class Task implements ITask {
private volatile boolean mIsWaiting; // 是否正在等待 private volatile boolean mIsRunning; // 是否正在执行 private volatile boolean mIsFinished; // Task是否执行完成 private volatile boolean mIsSend; // Task是否已经被分发
// 当前Task依赖的Task数量(需要等待被依赖的Task执行完毕才能执行自己),默认没有依赖 private CountDownLatch mDepends = new CountDownLatch(dependsOn() == null ? 0 : dependsOn().size());
/**
- 依赖的Task执行完一个
*/ public void satisfy() { mDepends.countDown(); }
/**
- 当前Task等待,让依赖的Task先执行
*/ public void waitToSatisfy() { try { mDepends.await(); } catch (InterruptedException e) { e.printStackTrace(); } }
/**
- 异步线程执行的Task是否需要在被调用await的时候等待,默认不需要
尾声
在我的博客上很多朋友都在给我留言,需要一些系统的面试高频题目。之前说过我的复习范围无非是个人技术博客还有整理的笔记,考虑到笔记是手写版不利于保存,所以打算重新整理并放到网上,时间原因这里先列出面试问题,题解详见:
展示学习笔记
网上,时间原因这里先列出面试问题,题解详见:
[外链图片转存中…(img-QMAVbJTA-1643888052241)] 展示学习笔记 [外链图片转存中…(img-Ybqr9f2a-1643888052242)] [外链图片转存中…(img-d3IXPVfk-1643888052242)]
本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录
|