内容简介:你的应用,启动够快吗?App 启动时,我们通常会执行很多既定的任务,比如各种 SDK 的初始化、各种数据的初始化等。这必将拖慢 App 的启动速度。
你的应用,启动够快吗?
App 启动时,我们通常会执行很多既定的任务,比如各种 SDK 的初始化、各种数据的初始化等。这必将拖慢 App 的启动速度。
启动速度,一直在我们的 App 优化清单上,而在 11 月举办的 Android 绿色联盟开发者大会上,推出了应用体验标准。对应用的兼容性、稳定性、性能、功能和安全,都做了详细的定义。
其中启动速度做了更细致的要求,冷启动 < 1s,热启动 < 0.5s。这当然是最理想的情况,具体还有外部因素的影响,例如手机配置。
启动时初始化的代码,势必会拖慢 App 的启动速度,但是不等待这些任务初始化完成呢,可能又会造成功能的缺失,而有时候不同任务还存在时序依赖的关系,要求我们先执行 A 任务,再执行 B 任务。
每次都特殊处理会增加复杂度,我们需要一套通用的解决方案。
这里给大家推荐一个 Alibaba 在 Github 上开源的一个 Alpha 的库。它是一个基于 PERT 图构建的 Android 异步启动框架。
Alibaba Alpha
PERT 图又称为“计划评审技术”,它采用网络图来描述一个项目的任务网络。不仅可以表达任务与任务之间的关系,不同的任务之间还可以有各种子任务。
Alpha 就是基于 PERT 图设计思想,它简单、高效、功能完整。利用 Alpha 在应用启动的时候,让这些任务并发处理,从而达到提高启动速度的目的。并且可以保证他们执行顺序的正确性。
Alpha 在使用时,只需要定义好自己的 Task,并描述它依赖的 Task,再将他们添加到 Project 中。框架会自动并发有序地执行这些 Task,最后将执行结果抛出来。
为了支持 Android 应用的多进程,Alpha 支持为不同进程配置不同的启动模式。
Alpha 的接入非常简单,它支持 Java 代码和配置文件两种方式来构建一个启动流程。
接入 Alpha
Gradle 依赖
compile 'com.alibaba.android:alpha:1.0.0.1@jar'
使用 Gradle 可能会导致失败,这里可以考虑通过源码引入的方式。
使用指南
1. 实现自己的 Task 类
在 Alpha 中,任务都是一个个 Task。定义一个 Task,并在 run() 方法中实现该 Task 需要做的事情。
public class SampleTask extends Task{
public SampleTask() {
super("SampleTask");
}
@Override
public void run() {
//do something, print a msg for example.
Log.d(TAG, "run SampleTask");
}
}
Task 默认是通过异步的方式在子线程中执行,如果这个 Task 需要在主线程中执行,可以在构造函数中指定。
/**
* 构造{@code Task}对象。
*
* @param name {@code Task}名字
* @param isInUiThread 是否在UI线程执行,true表示在UI线程执行,false表示在非UI线程执行,默认在非UI线程执行。
* <strong>注意:如果在UI线程执行,则不能再使用{@link AlphaManager#waitUntilFinish()},否则会造成死锁。</strong>
*/
public Task(String name, boolean isInUiThread) {
mName = name;
mIsInUiThread = isInUiThread;
}
2. 将 Task 组合成一个完整的 Project
可以用 Task.ProjectBuilder 依据各 Task 之间的依赖关系,将这些 Task 构建成一个完整的 Project。
private Task createCommonTaskGroup() {
Task a = new TaskA();
Task b = new TaskB();
Task c = new TaskC();
Task d = new TaskD();
Task e = new TaskE();
Project.Builder builder = new Project.Builder();
builder.add(a);
builder.add(b).after(a);
builder.add(c).after(a);
builder.add(d).after(b, c);
builder.add(e).after(a);
Project group = builder.create();
return group;
}
ProjectBuilder 生成的 Project 本身又可以作为一个 Task 嵌入到另一个 Project 中。
private Task createCommonTaskGroup() {
Task a = new TaskA();
Task b = new TaskB();
Task c = new TaskC();
Task d = new TaskD();
Task e = new TaskE();
Project.Builder builder = new Project.Builder();
builder.add(a);
builder.add(b).after(a);
builder.add(c).after(a);
builder.add(d).after(b, c);
builder.add(e).after(a);
Project group = builder.create();
return group;
}
private void createProject() {
Task group = createCommonTaskGroup();
Task f = new TaskF();
Project.Builder builder = new Project.Builder();
builder.add(group);
builder.add(f);
Project project = builder.create();
}
3. 监听 Task 执行结束
可以通过 addOnTaskFinishListener() 监听 Task 的执行结束。
/**
* <p>增加{@code Task}执行结束的监听,当该{@code Task}执行结束时,会回调
* {@link Task.OnTaskFinishListener#onTaskFinish(String)}。</p>
* <strong>注意:</strong>回调函数在{@code Task}所在线程中回调,注意线程安全。
*
* @param listener 监听{@code Task}执行结束的{@code listener}
*/
public void addOnTaskFinishListener(OnTaskFinishListener listener) {
if (!mTaskFinishListeners.contains(listener)) {
mTaskFinishListeners.add(listener);
}
}
4. 为构建完成的 Project 配置对应的进程
通过 addProject(),将 Project 配置到对应的进程中。
AlphaManager.getInstance(mContext) .addProject(project);
5. 执行启动流程
最后只需要调用一句 start() 方法,就可以执行这个完整的流程了。
AlphaManager.getInstance(mContext) .start();
Alpha 还提供了配置文件的方式来配置 Task 的关系,但是我不准备再详细介绍了,反正我不会这么用,有兴趣还是去查询 README 文件吧。
小结
利用 Alpha 我们可以有效的管理启动时初始化的一些任务,从而达到优化启动速度的目的。
Alpha 是 Alibaba 开源的,现在我还不确定用在了那些阿里系的商业项目上,不过从源码的角度来看,没有大坑,而且各自文档也很齐全,如果有这方面的需求,可以尝试使用。
【本文为51CTO专栏作者“张旸”的原创稿件,转载请通过微信公众号联系作者获取授权】
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 干掉restful:graphql真香!
- 干掉状态:从session到token
- 谷歌力推WebAssembly,要干掉JS?
- 谁告诉你 Flutter 会干掉原生开发?
- 区块链一来,数据库要被干掉了???
- Spring Boot中如何干掉if else
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Iterative Methods for Sparse Linear Systems, Second Edition
Yousef Saad / Society for Industrial and Applied Mathematics / 2003-04-30 / USD 102.00
Tremendous progress has been made in the scientific and engineering disciplines regarding the use of iterative methods for linear systems. The size and complexity of linear and nonlinear systems arisi......一起来看看 《Iterative Methods for Sparse Linear Systems, Second Edition》 这本书的介绍吧!