成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

是什么拖慢了你的 App 啟動?干掉它!

企業動態
這里給大家推薦一個 Alibaba 在 Github 上開源的一個 Alpha 的庫。它是一個基于 PERT 圖構建的 Android 異步啟動框架。

[[251194]]

你的應用,啟動夠快嗎?

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 依賴

  1. compile 'com.alibaba.android:alpha:1.0.0.1@jar' 

使用 Gradle 可能會導致失敗,這里可以考慮通過源碼引入的方式。

使用指南

1. 實現自己的 Task 類

在 Alpha 中,任務都是一個個 Task。定義一個 Task,并在 run() 方法中實現該 Task 需要做的事情。

  1. public class SampleTask extends Task{ 
  2.     public SampleTask() { 
  3.         super("SampleTask"); 
  4.     } 
  5.  
  6.     @Override 
  7.     public void run() { 
  8.         //do something, print a msg for example. 
  9.         Log.d(TAG, "run SampleTask"); 
  10.     } 

Task 默認是通過異步的方式在子線程中執行,如果這個 Task 需要在主線程中執行,可以在構造函數中指定。

  1. /** 
  2.     * 構造{@code Task}對象。 
  3.     * 
  4.     * @param name {@code Task}名字 
  5.     * @param isInUiThread 是否在UI線程執行,true表示在UI線程執行,false表示在非UI線程執行,默認在非UI線程執行。 
  6.     *                     <strong>注意:如果在UI線程執行,則不能再使用{@link AlphaManager#waitUntilFinish()},否則會造成死鎖。</strong> 
  7.     */ 
  8.    public Task(String name, boolean isInUiThread) { 
  9.        mName = name
  10.        mIsInUiThread = isInUiThread; 
  11.    } 

2. 將 Task 組合成一個完整的 Project

可以用 Task.ProjectBuilder 依據各 Task 之間的依賴關系,將這些 Task 構建成一個完整的 Project。

  1. private Task createCommonTaskGroup() { 
  2.     Task a = new TaskA(); 
  3.     Task b = new TaskB(); 
  4.     Task c = new TaskC(); 
  5.     Task d = new TaskD(); 
  6.     Task e = new TaskE(); 
  7.  
  8.     Project.Builder builder = new Project.Builder(); 
  9.     builder.add(a); 
  10.     builder.add(b).after(a); 
  11.     builder.add(c).after(a); 
  12.     builder.add(d).after(b, c); 
  13.     builder.add(e).after(a); 
  14.     Project group = builder.create(); 
  15.  
  16.     return group

ProjectBuilder 生成的 Project 本身又可以作為一個 Task 嵌入到另一個 Project 中。

  1. private Task createCommonTaskGroup() { 
  2.     Task a = new TaskA(); 
  3.     Task b = new TaskB(); 
  4.     Task c = new TaskC(); 
  5.     Task d = new TaskD(); 
  6.     Task e = new TaskE(); 
  7.  
  8.     Project.Builder builder = new Project.Builder(); 
  9.     builder.add(a); 
  10.     builder.add(b).after(a); 
  11.     builder.add(c).after(a); 
  12.     builder.add(d).after(b, c); 
  13.     builder.add(e).after(a); 
  14.     Project group = builder.create(); 
  15.  
  16.     return group
  17.  
  18. private void createProject() { 
  19.     Task group = createCommonTaskGroup(); 
  20.     Task f = new TaskF(); 
  21.  
  22.     Project.Builder builder = new Project.Builder(); 
  23.     builder.add(group); 
  24.     builder.add(f); 
  25.  
  26.     Project project = builder.create(); 

3. 監聽 Task 執行結束

可以通過 addOnTaskFinishListener() 監聽 Task 的執行結束。

  1. /** 
  2.     * <p>增加{@code Task}執行結束的監聽,當該{@code Task}執行結束時,會回調 
  3.     * {@link Task.OnTaskFinishListener#onTaskFinish(String)}。</p> 
  4.     * <strong>注意:</strong>回調函數在{@code Task}所在線程中回調,注意線程安全。 
  5.     * 
  6.     * @param listener 監聽{@code Task}執行結束的{@code listener} 
  7.     */ 
  8.    public void addOnTaskFinishListener(OnTaskFinishListener listener) { 
  9.        if (!mTaskFinishListeners.contains(listener)) { 
  10.            mTaskFinishListeners.add(listener); 
  11.        } 
  12.    } 

4. 為構建完成的 Project 配置對應的進程

通過 addProject(),將 Project 配置到對應的進程中。

  1. AlphaManager.getInstance(mContext) 
  2.             .addProject(project); 

5. 執行啟動流程

***只需要調用一句 start() 方法,就可以執行這個完整的流程了。

  1. AlphaManager.getInstance(mContext) 
  2.             .start(); 

Alpha 還提供了配置文件的方式來配置 Task 的關系,但是我不準備再詳細介紹了,反正我不會這么用,有興趣還是去查詢 README 文件吧。

小結

利用 Alpha 我們可以有效的管理啟動時初始化的一些任務,從而達到優化啟動速度的目的。

Alpha 是 Alibaba 開源的,現在我還不確定用在了那些阿里系的商業項目上,不過從源碼的角度來看,沒有大坑,而且各自文檔也很齊全,如果有這方面的需求,可以嘗試使用。

【本文為51CTO專欄作者“張旸”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】

 

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-12-12 09:18:38

DevOpsIT管理系統

2018-02-28 15:39:52

2018-12-21 16:00:12

Windows 10Windows安全模式

2018-08-20 20:46:07

2024-11-25 12:20:00

Hystrix微服務架構

2021-02-03 10:23:59

Wi-Fi 7Wi-Fi6數據速率

2021-05-09 09:30:13

Docker操作系統容器

2020-11-24 07:41:52

邊緣計算

2021-07-29 11:46:27

NAS存儲NAS服務器

2023-04-17 14:21:19

5G無線技術

2022-02-24 23:37:19

區塊鏈錢包比特幣

2020-03-02 14:18:33

程序員技能開發者

2011-03-01 10:19:10

2021-02-18 16:06:43

JavaStream代碼

2012-11-23 10:45:04

程序員僵尸代碼

2024-12-03 09:34:35

觀察者模 式編程Javav

2025-02-11 09:51:52

2021-09-26 05:41:13

數字困境IT領導數字轉型

2020-11-24 13:05:35

Go語言泛型

2022-07-19 08:04:04

HTTP應用層協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区影院 | 不卡一区二区三区四区 | 日韩在线资源 | 五月天天丁香婷婷在线中 | 国产精品欧美一区二区三区不卡 | 亚洲一二三区不卡 | av高清| 久久久久国产成人精品亚洲午夜 | 亚洲黄色国产 | 久久久久网站 | 国产高清在线观看 | 久久综合婷婷 | 精品久久香蕉国产线看观看亚洲 | 国产成人免费视频网站视频社区 | 亚洲日本欧美日韩高观看 | 亚洲成人精品在线观看 | 国产在线1 | 成年人在线| 午夜欧美 | 在线免费视频一区 | 日韩三级一区 | 日韩成人免费视频 | 成人免费小视频 | www网站在线观看 | 欧美精品一区二区三区四区五区 | 91久色 | 国产精品性做久久久久久 | 午夜小视频在线观看 | 亚洲国产福利视频 | 91视频精选 | 免费三级网 | 成人一区二区三区在线观看 | 日本久久网 | 色综久久| 亚洲a在线视频 | 午夜小视频在线播放 | 蜜臀久久99精品久久久久久宅男 | 国产免费麻豆视频 | 成人精品久久 | 中文字幕二区 | 欧美一级特黄aaa大片在线观看 |