热门标签 | 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;项目实战源码》收录



推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 栈和队列的共同处和不同处
    本文主要介绍了栈和队列的共同处和不同处。栈和队列都是由几个数据特性相同的元素组成的有限序列,也就是线性表。队列是限定仅在表的一端插入元素、在另一端删除元素的线性表,遵循先进先出的原则。栈是限定仅在表尾进行插入或删除操作的线性表,遵循后进先出的原则。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
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社区 版权所有