查看在线pdf文档:
http://note.youdao.com/s/EM20Cggm
以下是我的基本UI组件该系列的文章,欢迎大家转载和分享:
基本UI组件的封装库(一)——basicUI
基本UI组件的封装库(二)——basicUI
基本UI组件的封装库——basicUI的demo的编写
基本UI组件的封装库(三)——basicUI
基本UI组件的封装库(四)——basicUI
basicUI(五)——RecycleView的下拉刷新、加载更多和多状态布局实现
basicUI(六)——工具类的封装
basicUI(七)——Android启动优化之启动器开发
项目库的GitHub地址:https://github.com/Peakmain/BasicUI
- 如果大家觉得有点帮助,希望可以抬抬你的贵手,送我一个星星,谢谢。如果有什么问题,也欢迎你在下方留言或者在BasicUI中提
前言
在应用启动的时候,我们通常会有很多工作需要做,为了提高启动速度,我们会尽可能让这些工作并发进行。但这些工作之间可能存在前后依赖的关系,所以我们又需要想办法保证他们执行顺序的正确性。这就可以用到有向无环图的设计。
How to
Step 1. Add the JitPack repository to your build file
Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Step 2. Add the dependency
dependencies {
implementation 'com.github.Peakmain:BasicUI:1.0.3'
}
使用
- 1、并发运行,只需要继承Task
public class UtilsTask extends Task {
@Override
public void run() {
//处理数据
}
}
- 2、在某个Task之后执行,比如极光需要在获取设备id之后执行
如:获取设备id的Task
public class DeviceIdTask extends Task {
private String mDeviceId;
@Override
public void run() {
// 真正自己的代码
TelephonyManager tManager = (TelephonyManager) mContext.getSystemService(
Context.TELEPHONY_SERVICE);
mDeviceId = tManager.getDeviceId();
App app = (App) mContext;
app.setDeviceId(mDeviceId);
}
}
极光的Task需要实现dependsOn方法
如下代码
public class JPushTask extends Task {
@Override
public List<Class<? extends Task>> dependsOn() {
List<Class<? extends Task>> tasks = new ArrayList<>();
tasks.add(DeviceIdTask.class);
return tasks;
}
@Override
public void run() {
//模拟极光推送
LogUtils.e("极光推送开始");
App app = (App) mContext;
LogUtils.e("极光推送获取id:",app.getDeviceId());
}
}
- 3、运行在主线程只需要继承MainTask即可
public class WeexTask extends MainTask {
@Override
public void run() {
InitConfig config = new InitConfig.Builder().build();
WXSDKEngine.initialize((Application) mContext, config);
}
}
- 4、想空闲的时候处理数据,只需要在Application中使用DelayInitDispatcher添加相关Task
DelayInitDispatcher delayInitDispatcher=new DelayInitDispatcher();
delayInitDispatcher.addTask(任务即可).start();
- 5、最后只需要在Application中进行初始化和添加运行就可以了
TaskDispatcher.init(this);
TaskDispatcher dispatcher = TaskDispatcher.createInstance();
dispatcher.addTask(new AMapTask())
.addTask(new UtilsTask())
.addTask(new JPushTask())
.addTask(new DeviceIdTask())
.addTask(new WeexTask())
.start();
部分原理

有向无环图的设计

public class Graph {
//顶点数量
private int mVerticeCount;
//领接表
private List<Integer>[] adj;
//边的数量
private int mEdgeCount;
public Graph(int count) {
this.mVerticeCount = count;
adj = new ArrayList[count];
for (int i = 0; i < mVerticeCount; i++) {
adj[i] = new ArrayList<>();
}
}
/**
* 添加边,方向u->v
*
* @param u from
* @param v to
*/
public void addEdge(int u, int v) {
adj[u].add(v);
mEdgeCount++;
}
//获取边的数量
public int getEdgeCount() {
return mEdgeCount;
}
/**
* 拓扑排序
*/
public Vector<Integer> topologicalSort() {
//1、遍历所有的顶点的邻接表,添加入度
int[] indegree = new int[mVerticeCount];
for (int i = 0; i < mVerticeCount; i++) {
ArrayList<Integer> temp = (ArrayList<Integer>) adj[i];
for (int node : temp) {
indegree[node]++;
}
}
//2、找到入度为0的head task
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < mVerticeCount; i++) {
if (indegree[i] == 0) {
queue.add(i);
}
}
//3、进行拓扑排序
int cnt = 0;
Vector<Integer> result = new Vector<>();
while (!queue.isEmpty()) {
Integer u = queue.poll();
result.add(u);
//0的所有领接表
for (Integer node : adj[u]) {
//如果入度数为0,则添加队列中
if (--indegree[node] == 0) {
queue.add(node);
}
}
cnt++;
}
//4、判断当前是否有环
if (cnt != mVerticeCount) {
throw new IllegalStateException("图中不可存在环");
}
return result;
}
}
测试有向无环图
//准备有向图
Graph graph = new Graph(6);
graph.addEdge(0, 2);
graph.addEdge(0, 3);
graph.addEdge(2, 4);
graph.addEdge(3, 4);
graph.addEdge(4, 5);
graph.addEdge(1, 3);
//通过TopoLogical对象堆有向图中的顶点进行排序
Vector<Integer> vector = graph.topologicalSort();
StringBuilder sb = new StringBuilder();
for (Integer w : vector) {
sb.append(w + "->");
}
String str = sb.toString();
int index = str.lastIndexOf("->");
str = str.substring(0,index);
System.out.println(str);
结果:

网友评论