天天看點

Android啟動優化--異步優化

Theme 切換

Android啟動優化--異步優化
Android啟動優化--異步優化
Android啟動優化--異步優化

啟動優化--異步優化

核心思想:子線程分擔主線程任務,并行減少時間。

異步優化,分為 : 正常異步優化  和 最優異步優化 兩種

正常異步優化

經驗:

(1)采用線程池的方法,線程的個數按照CPU的個數來;

(2)并不是每個Application.onCreate()中的語句都需要放線上程池中。比如有的方法裡含有“Handler handler = new Handler();”語句,這樣的語句在子線程中是不能執行的,因為沒有對應的MessageQueue,解決辦法是添加Looper,比如“ Handler handler = new Handler(Looper.getMainLooper()); ”

(3)還有一種情況,就是方法必須在Application.onCreate()語句執行完之前,這種也不能丢線上程池中。解決辦法是用“ CountDownLatch ”。步驟如下:

(a)定義: private CountDownLatch mCountDownLatch = new CountDownLatch(1);

(b)條件被滿足之後的地方使用:mCountDownLatch.countDown();

(c)需要等待條件執行完的地方:mCountDownLatch.await();

// 主要代碼:

    //線程池
    public void threadPool(){
        ExecutorService service =Executors.newFixedThreadPool(CORE_POOL_SIZE);
        service.submit(new Runnable() {
            @Override
            public void run() {
                FirstTask.onStart();
            }
        });
        service.submit(new Runnable() {
            @Override
            public void run() {
                SecondTask.onStart();
                // 這個先執行,才執行await()之後的方法。
                mCountDownLatch.countDown();
            }
        });
        service.submit(new Runnable() {
            @Override
            public void run() {
                ThirdTask.onStart();
            }
        });

        // 等待
        try {
            mCountDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }           

痛點:

(1)代碼不優化

(2)場景不好處理(子任務中有依賴關系)

(3)維護成本高

最優異步優化--啟動器

核心思想:充分利用CPU多核,自動梳理任務順序

啟動器流程:

(1)代碼Task化,啟動邏輯抽象為Task

(2)根據所有任務依賴關系排序生成一個有向無環圖

(3)多線程按照排序後的優先級依次執行

Android啟動優化--異步優化

實操:

第一步,繼承 Task 類,添加需要執行的任務

// (1)需要執行的任務放在,繼承Task的類中,的run()方法中。
// (2)也可以繼承 MainTask 類,表示執行的是在主線程中

public class InitSecondTask extends Task {
    //表示:這個任務需要等待它執行完
    @Override
    public boolean needWait() {
        return true;
    }

    @Override
    public void run() {
        //真正我們自己的任務
        SecondTask.onStart();
    }
}


/**
 * 需要在IntiSleepTask之後執行
 */
public class InitThirdTask extends Task {
    // 一個任務依賴另一個任務
    @Override
    public List<Class<? extends Task>> dependsOn() {
        List<Class<? extends Task>> task = new ArrayList<>();
        task.add(InitSleepTask.class);
        return task;
    }
    @Override
    public void run() {
        ThirdTask.onStart();
    }
}
           

第二部,啟動啟動器。

// 将下面的代碼放在 Application.onCrate() 的方法體中。

    // 啟動器方法啟動
    public void launcherInit(){
        // 啟動器
        TaskDispatcher.init(MyApplication.this);
        TaskDispatcher dispatcher = TaskDispatcher.createInstance();

        dispatcher.addTask(new InitFirstTask())
                .addTask(new InitSecondTask())
                .addTask(new InitThirdTask())
                .addTask(new InitSleepTask())
                .start();

        dispatcher.await();  // 啟動器等待
    }           
上一篇: hive配置
下一篇: Hive部署