WorkManager用法詳解

2021-08-21 22:42:36 字數 3920 閱讀 6376

workmanager是什麼?它是谷歌提供的architecture components 架構元件的庫中的其中乙個庫,workmanager有什麼用?官方解釋如下:

下面來看看這個庫怎麼用?

首先你需要在根build.gradle中加入

allprojects 

}

然後在專案中的build.gradle中加入

dependencies
在裡面寫上你要處理的**,也就是你要做的工作,顧名思義,谷歌起名為worker。2、選擇work請求(onetimeworkrequest(只執行一次任務的請求類),periodicworkrequest(可以執行多次任務的請求,類似鬧鐘)

//只執行一次任務

onetimeworkrequest compressionwork =

new onetimeworkrequest.builder(workertyou.class)

.build();

//執行多次任務,每隔12個小時執行一次

periodicworkrequest.builder photocheckbuilder =

new periodicworkrequest.builder(workertyou.class, 12,

timeunit.hours);

//執行任務

workmanager.getinstance().enqueue(compressionwork);

3、監聽任務執行狀態

workmanager.getinstance().getstatusbyid(compressionwork.getid())

.observe(this, new observer()

});

4、限制任務執行條件constraints(例如裝置空閒的時候執行或者鏈結電源的時候使用等)

constraints
//只執行一次任務

constraints myconstraints = new constraints.builder()

//手機裝置空閒的時候使用

.setrequiresdeviceidle(true)

//手機接通電源的時候使用

.setrequirescharging(true)

//網路連線的時候執行任務

.setrequirednetworktype(networktype.connected)

//電池電量低於臨界水平不可用

.setrequiresbatterynotlow(true)

//可用儲存不能低於臨界值

.setrequiresstoragenotlow(true)

.build();

onetimeworkrequest compressionwork =

new onetimeworkrequest.builder(workertyou.class).setconstraints(myconstraints)

.build();

5、按順序執行任務

workmanager.getinstance()

.beginwith(worka)

// note: workmanager.beginwith() returns a

// workcontinuation object; the following calls are

// to workcontinuation methods

.then(workb) // fyi, then() returns a new workcontinuation instance

.then(workc)

.enqueue();

先執行任務a再執行任務b再執行任務c。

workmanager.getinstance()

// first, run all the a tasks (in parallel):

.beginwith(worka1, worka2, worka3)

// ...when all a tasks are finished, run the single b task:

.then(workb)

// ...then run the c tasks (in any order):

.then(workc1, workc2)

.enqueue();

同時執行worka1、worka2、worka3,然後執行workb,再同時執行workc1和workc2.

6、特殊順序處理workcontinuation

如圖執行這樣的順序應該怎麼處理:

7、為請求設定tag以方便獲取任務執行'狀態和取消

onetimeworkrequest cachecleanuptask =

new onetimeworkrequest.builder(mycachecleanupworker.class)

.setconstraints(myconstraints)

.addtag("cleanup")

.build();

8、執行任務傳值

setinputdata
//傳值

data mydata = new data.builder()

// we need to pass three integers: x, y, and z

.putint(key_x_arg, 42)

.putint(key_y_arg, 421)

.putint(key_z_arg, 8675309)

// ... and build the actual data object:

.build();

// ...then create and enqueue a onetimeworkrequest that uses those arguments

onetimeworkrequest mathwork = new onetimeworkrequest.builder(mathworker.class)

.setinputdata(mydata)

.build();

workmanager.getinstance().enqueue(mathwork);

//接收值

workmanager.getinstance().getstatusbyid(mathwork.getid())

.observe(lifecycleowner, status ->

});

const用法詳解

物件導向是c 的重要特性.但是c 在c的基礎上新增加的幾點優化也是很耀眼的 就const直接可以取代c中的 define 以下幾點很重要,學不好後果也也很嚴重 1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安...

const 用法詳解

物件導向是c 的重要特性.但是c 在c的基礎上新增加的幾點優化也是很耀眼的 就const直接可以取代c中的 define 以下幾點很重要,學不好後果也也很嚴重 1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安...

extern用法詳解

1 基本解釋 extern可以置於變數或者函式 前,以標示變數或者函式 的定義在別的檔案中,提示編譯器遇到此變數和函式 時在其他模組中尋找其定義。另外,extern也可用來進行鏈結指定。2 問題 extern 變數 在乙個原始檔裡定義了乙個陣列 char a 6 在另外乙個檔案裡用下列語句進行了宣告...