<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Android-InitAndroid 應(yīng)用調(diào)度工具

          聯(lián)合創(chuàng)作 · 2023-09-25 03:35

          Init 幫助 Android 應(yīng)用調(diào)度復(fù)雜的任務(wù)流(如應(yīng)用初始化流程),如下一節(jié)圖示的那種任務(wù)流,處理類型、優(yōu)先級、多進(jìn)程(像是每個(gè)進(jìn)程都會執(zhí)行application的onCreate),任務(wù)依賴,提高應(yīng)用啟動效率。

          盡管Init設(shè)計(jì)的初衷是為了應(yīng)用(application)初始化,但并不局限于此,它可以于應(yīng)用在任何復(fù)雜的初始化流程。

          Init不依賴于任何第三方庫,使用Java concurrent并部分依賴于Android SDK(Context, Log),所以理論上也可以在簡單修改后直接用于Java工程。

          How

          初始化流程被抽象為flow、wave和task。

          flow 是一個(gè)粗粒度概念,通常一個(gè)應(yīng)用只有一個(gè)flow,但某些情況下我們可能擁有多個(gè)flow,像是patch flow,broadcast flow,fake UI flow等等,可以把它們都交給Init處理。

          每個(gè) wave 只有在上一wave的所有阻塞task完成后才能開始,而所有屬于該wave的task會一起開始執(zhí)行(除非被賦予了delay)。

          至于task,在本庫中屬于原子性操作,他們可以被分為2大類型

          1. 阻塞task,即圖中的藍(lán)色任務(wù)。

          2. 異步task,又可以被分為

          • 完全異步或者橫跨若干個(gè)wave后才需要阻塞,像圖中的綠色task。

          • 異步鏈,像圖中的紅色task。

          使用

          dependencies {
              compile 'cn.zhaiyifan:init:1.0.1'
          }
          public class DemoApplication extends Application {
              @Override
              public void onCreate() {
                  super.onCreate();
                  // Init需要應(yīng)用context來獲得進(jìn)程相關(guān)信息
                  Init.init(this);
                  // 可以使用自定義的log離開輸出Init的Log,logProxy需要實(shí)現(xiàn)cn.zhaiyifan.appinit.ILog接口
                  // Init.init(this, logProxy)
                  // 默認(rèn)Task,延遲0,且阻塞下一波task的執(zhí)行,參數(shù)字符串可以用來追蹤任務(wù)執(zhí)行狀態(tài)
                  Task task1 = new Task("task1") {
                      @Override
                      protected void start() {
                          doSomeThing();
                      }
                      // 僅在返回true的時(shí)候才會在對應(yīng)進(jìn)程執(zhí)行
                      @Override
                      public boolean runOnProcess(String processName) {
                          return processName.equals("cn.zhaiyifan.demo");
                      }
                  };
                  // 創(chuàng)建一個(gè)task,非阻塞,且延時(shí)300毫秒執(zhí)行
                  Task task2 = new Task("task2", false, 300) {
                      @Override
                      protected void start() {
                          doSomeThing();
                      }
                  };
                  // 類似地,創(chuàng)建更多task,如task3、task4等等
                  // 創(chuàng)建一個(gè)有名flow
                  Flow flow = new Flow("flow");
                  // 往flow添加剛才創(chuàng)建的task, 第一個(gè)參數(shù)是wave序號,會從小到大執(zhí)行每個(gè)wave的task
                  flow.addTask(1, task1).addTask(1, task2).addTask(2, task3).addTask(2, task4);
                  // 啟動flow,開始初始化
                  Init.start(flow);
              }

          看一下log,可以發(fā)現(xiàn)原來一個(gè)串行執(zhí)行需要2700毫秒的任務(wù),在我們的安排下,現(xiàn)在只需要1307毫秒就可以結(jié)束。

          10-04 18:53:54.789 646-666/cn.zhaiyifan.init I/Task: task2 runs 500
          10-04 18:53:55.289 646-665/cn.zhaiyifan.init I/Task: task1 runs 1000
          10-04 18:53:55.591 646-741/cn.zhaiyifan.init I/Task: task3 runs 300
          10-04 18:53:55.592 646-646/cn.zhaiyifan.init I/Flow: flow runs 1307
          10-04 18:53:55.990 646-740/cn.zhaiyifan.init I/Task: task4 runs 700
          10-04 18:53:56.191 646-783/cn.zhaiyifan.init I/Task: task5 runs 200

          Useful api:

          // 設(shè)置線程池大小
          Init.setThreadPoolSize(...)
          // 取消一個(gè)已經(jīng)開始的flow
          Init.cancel(...)
          // 獲得flow狀態(tài)
          Init.getFlowStatus(...)
          // 獲得特定的task狀態(tài)
          flow.getTaskStatus(taskName)
          // 設(shè)置超時(shí)限制
          flow.setTimeout(5000)
          等等

          更多詳情請見demo工程。

          為什么需要 Init

          想象一下我們是怎么去初始化一個(gè)大型應(yīng)用像是支付寶、QQ、微信、空間等的,我們會面對像是下面這種代碼:

          public class XXXApplication {
              // for multi-dex apps
              @Override
              protected void attachBaseContext(Context base) {
                  // log init
                  ...
                  // eventbus init...
                  ...
                  // global variables init
                  ...
                  // process related
                  String processName = ...
                  boolean isMainProcess = ...
                  ProcessInit.attachBaseContext(this, processName, isMainProcess);
              }
              @Override
              protected void onCreate() {
                  // process related
                  String processName = ...
                  boolean isMainProcess = ...
                  // CrashHandler, SafeMode, plugin, image manager, database, download, update, etc init
                  ProcessInit.onCreate(this, processName, isMainProcess);
              }
          }
          public class ProcessInit {
              ...
              public static void onCreate(Application application, boolean isMainProcess, String processName) {
                  if (isMainProcess) {
                  }
              } else if (processName.contains(PUSH_PROCESS_SUFFIX)) {
                  ...
              } else if (processName.contains(WEB_PROCESS_SUFFIX)) {
                  ...
              } else if (processName.contains(MUSIC_PROCESS_SUFFIX)) {
                  ...
              } else {
                  ...
              }
              ...
          }

          你看到了當(dāng)一個(gè)應(yīng)用越來越大以后初始化能是一件多么復(fù)雜的事情,有些操作必須在另一個(gè)之后,而又有一些可以并行執(zhí)行,又有的操作又需要在一個(gè)異步操 作完成后才能執(zhí)行......于是我們就得把每個(gè)獨(dú)立的操作進(jìn)行修改,有的改成異步,有的則阻塞在另一個(gè)操作后,使得代碼雜亂且難以維護(hù)。

          怎么可以使它變得簡單呢?Init就是來幫助你做這個(gè)事的。

          路線圖

          • 1.0 10月 - 一個(gè)實(shí)現(xiàn)上述概念的可運(yùn)行庫 已完成

          • 1.1 2015年內(nèi) - 支持更復(fù)雜的初始化flow 進(jìn)行中

          • 2.0 或許明年 - 從使用本庫的代碼可以直接逆向出初始化flow的圖

          瀏覽 28
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人无码app | 日韩视频―中文字幕 | 国产色婷婷国产综合在线 | 久久九九免费视频 | 九色PORNY原创自拍 |