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