热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一线大厂大型APP性能优化系列—更优雅的延迟方案(四,android开发技术栈

废话不多说,直接上代码,顺便附一张之前战斗过的地方,项目虽好,但是工作室太“简陋”,做完几个版本就溜了。。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;项目实战源码》收录



推荐阅读
author-avatar
aaaa
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有