美文网首页
basicUI(七)——Android启动优化之启动器开发

basicUI(七)——Android启动优化之启动器开发

作者: Peakmain | 来源:发表于2020-12-10 17:10 被阅读0次

查看在线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();

部分原理

原理图.png

有向无环图的设计


image.png
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);

结果:


image.png

相关文章

网友评论

      本文标题:basicUI(七)——Android启动优化之启动器开发

      本文链接:https://www.haomeiwen.com/subject/kqjlgktx.html