49. WorkManager的使用和原理

簡介

WorkManger是Android Jetpack提供執行後臺任務管理的組件,它適用於需要保證 系統即使應用程序退出也會運行的任務,WorkManager API可以輕鬆指定可延遲的 異步任務以及何時運行它們,這些API允許您創建任務並將其交給WorkManager立 即運行或在適當的時間運行。
WorkManager根據設備API級別和應用程序狀態等因素選擇適當的方式來運行任 務。如果WorkManager在應用程序運行時執行您的任務之一,WorkManager可以 在您應用程序進程的新線程中運行您的任務。如果您的應用程序未運行, WorkManager會選擇一種合適的方式來安排後臺任務 - 具體取決於設備API級別和包 含的依賴項,WorkManager可能會使用 JobScheduler,Firebase JobDispatcher或 AlarmManager

WorkManager作用

一:確保重要的後臺任務,一定會被執行,後臺任務(例如:非及時性的 (請求服 務器 及時性) 上傳,下載,同步數據 等)
二:內部對電量進行了優化,不需要我們去處理電量優化了
三:API 14 到 最新版本,都可以使用WorkManager來管你你的後臺任務
四:注意:WorkManager不能做保活操作 (重複執行後臺任務的最少執行單位是 15分鐘,源碼內部限制)

WorkManager的各個角色

Worker:指定需要執行的任務,可以成爲Workder類的子類,在實
現的方法中,就可以執行任務邏輯了
WorkRequest:執行一項單一的任務
第一點:必須知道 WorkRequest對象,必須指定Work執行的任務
第二點:需要知道 WorkRequest都有一個自動生成的唯一ID,可以使用ID執行取消 排隊任務 或 獲取任務狀態等操作
第三點:需要知道 WorkRequest是一個抽象的類;系統默認實現子類 OneTimeWorkRequest或PeriodicWorkRequest
第四點:需要知道 WorkRequest.Builder創建WorkRequest對象;相應的子類: OneTimeWorkRequest.Builder或PeriodicWorkRequest.Builder
第五點:需要知道 Constraints:指定對任務運行時間的限制(任務約束);使用 Constraints.Builder創建Constraints對象 ,並傳遞給WorkRequest.Builder

主線流程

使用方式

implementation "androidx.work:work-runtime:2.3.4"

1.創建一個任務
創建一個類,繼承自Worker

public class MainWorker1 extends Worker {

    private final static String TAG = MainWorker1.class.getSimpleName();

    public MainWorker1(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    // 後臺任務 並且 異步的
    @NonNull
    @Override
    public Result doWork() {
        Log.d(TAG, "MainWorker1 doWork: run started ... ");
        try {
            Thread.sleep(8000); // 睡眠
        } catch (InterruptedException e) {
            e.printStackTrace();
            return Result.failure(); // 本次任務失敗
        } finally {
            Log.d(TAG, "MainWorker1 doWork: run end ... ");
        }
        return Result.success(); // 本次任務成功
    }
}

2.執行任務

OneTimeWorkRequest oneTimeWorkRequest =
                new OneTimeWorkRequest.Builder(MainWorker1.class).build();
WorkManager.getInstance(this).enqueue(oneTimeWorkRequest);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章