Jetpack使用(六) WorkManager的4種用法

寫在前面:Jetpack的更新速度非常快,可能你一個(gè)月前看WorkManager是這樣用的,下個(gè)月這個(gè)使用方法就有可能被廢棄了(我看源碼的時(shí)候是遇到過的,而且源碼也變了,但核心原理是不變的),所以我們這一系列文章偏重講原理,使用就一帶而過(因?yàn)橹v了也沒用啊,會(huì)變的。。。。。,讀者使用最好看官方文檔官方文檔
,當(dāng)然我這里講的也是截止到目前的最新用法)。

Jetpack使用(一)Lifecycles核心原理
Jetpack使用(二)LiveData核心原理
Jetpack使用(三)DataBinding核心原理
Jetpack使用(四)ViewModel核心原理
Jetpack使用(五)Navigation核心原理
Jetpack使用(六) WorkManager的4種用法

WorkManager有什么用:

一:確保重要的后臺(tái)任務(wù),一定會(huì)被執(zhí)行,后臺(tái)任務(wù)(例如:非及時(shí)性的 (請(qǐng)求服務(wù)器 及時(shí)性) 上傳,下載,同步數(shù)據(jù) 等)

二:內(nèi)部對(duì)電量進(jìn)行了優(yōu)化,不需要我們?nèi)ヌ幚黼娏績?yōu)化了

三:API 14 到 最新版本,都可以使用WorkManager來管你你的后臺(tái)任務(wù)

四:注意:WorkManager不能做?;畈僮?/p>

五:調(diào)度,管理,執(zhí)行的后臺(tái)任務(wù)的場(chǎng)景,通常是是可延遲的后臺(tái)任務(wù)

注意:WorkManager之所以能做到這些,其實(shí)就是通過使用android系統(tǒng)的服務(wù)來管理Room數(shù)據(jù)庫里的任務(wù)列表來來完成的。

使用

新建一個(gè)后臺(tái)任務(wù)MainWorkManager

/**
 * 后臺(tái)任務(wù)
 */
public class MainWorkManager extends Worker {

    public final static String TAG = MainWorkManager.class.getSimpleName();

    private Context mContext;
    private WorkerParameters workerParams;

    // 有構(gòu)造函數(shù)
    public MainWorkManager(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
        this.mContext = context;
        this.workerParams = workerParams;
    }

    @SuppressLint("RestrictedApi")
    @NonNull
    @Override
    public Result doWork() {

        Log.d(TAG, "doWork: 后臺(tái)任務(wù)執(zhí)行了");

        // 接收Activity傳遞過來的數(shù)據(jù)
        final String dataString = workerParams.getInputData().getString("wdy");
        Log.d(TAG, "doWork: 接收Activity傳遞過來的數(shù)據(jù):" + dataString);

        // 反饋數(shù)據(jù) 給 Activity
        // 把任務(wù)中的數(shù)據(jù)回傳到activity中
        Data outputData = new Data.Builder().putString("wdy", "三分歸元?dú)?).build();
        Result.Success success = new Result.Success(outputData);

        // return new Result.Failure(); // 本地執(zhí)行 doWork 任務(wù)時(shí) 失敗
        // return new Result.Retry(); // 本地執(zhí)行 doWork 任務(wù)時(shí) 重試
        // return new Result.Success(); // 本地執(zhí)行 doWork 任務(wù)時(shí) 成功 執(zhí)行任務(wù)完畢
        return success;
    }
}
  • 1、單一任務(wù)和MainActivity互傳數(shù)據(jù)
public void testBackgroundWork1(View view) {

        // 單一的任務(wù)  一次
        OneTimeWorkRequest oneTimeWorkRequest1;

        // 數(shù)據(jù)
        Data sendData = new Data.Builder().putString("wdy", "九陽神功").build();

        // 請(qǐng)求對(duì)象初始化
        oneTimeWorkRequest1 = new OneTimeWorkRequest.Builder(MainWorkManager.class)
                .setInputData(sendData) // 數(shù)據(jù)的攜帶
                .build();

        WorkManager.getInstance(this).getWorkInfoByIdLiveData(oneTimeWorkRequest1.getId())
                .observe(this, new Observer<WorkInfo>() {
                    @Override
                    public void onChanged(WorkInfo workInfo) {
                        Log.d(MainWorkManager.TAG, "Activity取到了任務(wù)回傳的數(shù)據(jù): " + workInfo.getOutputData().getString("wdy"));

                        Log.d(MainWorkManager.TAG, "狀態(tài):" + workInfo.getState().name());
                        if (workInfo.getState().isFinished()) {
                            Log.d(MainWorkManager.TAG, "狀態(tài):isFinished=true 后臺(tái)任務(wù)已經(jīng)完成了...");
                        }
                    }
                });

        // 請(qǐng)求對(duì)象 加入到隊(duì)列
        WorkManager.getInstance(this).enqueue(oneTimeWorkRequest1);
    }
  • 2、多個(gè)任務(wù)
  public void testBackgroundWork2(View view) {
        OneTimeWorkRequest oneTimeWorkRequest2 = new OneTimeWorkRequest.Builder(MainWorkManager2.class).build();
        OneTimeWorkRequest oneTimeWorkRequest3 = new OneTimeWorkRequest.Builder(MainWorkManager3.class).build();
        OneTimeWorkRequest oneTimeWorkRequest4 = new OneTimeWorkRequest.Builder(MainWorkManager4.class).build();
        OneTimeWorkRequest oneTimeWorkRequest5 = new OneTimeWorkRequest.Builder(MainWorkManager5.class).build();

        // 順序執(zhí)行
        WorkManager.getInstance(this).beginWith(oneTimeWorkRequest2)
                .then(oneTimeWorkRequest3)
                .then(oneTimeWorkRequest4)
                .then(oneTimeWorkRequest5)
                .enqueue();

      
    }
  • 3、重復(fù)執(zhí)行任務(wù)
public void testBackgroundWork3(View view) {

        // 重復(fù)的任務(wù)  多次  循環(huán)  , 最少循環(huán)重復(fù) 15分鐘(少于15分鐘默認(rèn)為15分鐘)
        PeriodicWorkRequest periodicWorkRequest =
                new PeriodicWorkRequest.Builder(MainWorkManager2.class, 20, TimeUnit.SECONDS).build();

        // 監(jiān)聽狀態(tài)
        WorkManager.getInstance(this).getWorkInfoByIdLiveData(periodicWorkRequest.getId())
                .observe(this, new Observer<WorkInfo>() {
                    @Override
                    public void onChanged(WorkInfo workInfo) {
                        Log.d(MainWorkManager.TAG, "狀態(tài):" + workInfo.getState().name());
                        if (workInfo.getState().isFinished()) {
                            Log.d(MainWorkManager.TAG, "狀態(tài):isFinished=true 后臺(tái)任務(wù)已經(jīng)完成了...");
                        }
                    }
                });

        WorkManager.getInstance(this).enqueue(periodicWorkRequest);
    }

  • 4、約束條件
 public void testBackgroundWork4(View view) {

        // 約束條件,必須滿足我的條件,才能執(zhí)行后臺(tái)任務(wù) (在連接網(wǎng)絡(luò),插入電源 并且 處于空閑時(shí))  內(nèi)部做了電量優(yōu)化(Android App 不耗電)
        Constraints myConstraints = new Constraints.Builder()
                .setRequiredNetworkType(NetworkType.CONNECTED) // 網(wǎng)絡(luò)鏈接中...
                .setRequiresCharging(true) // 充電中..
                .setRequiresDeviceIdle(true) // 空閑時(shí).. (cpu使用率低)
                .build();

        /**
         * 除了上面設(shè)置的約束外,WorkManger還提供了以下的約束作為Work執(zhí)行的條件:
         *  setRequiredNetworkType:網(wǎng)絡(luò)連接設(shè)置
         *  setRequiresBatteryNotLow:是否為低電量時(shí)運(yùn)行 默認(rèn)false
         *  setRequiresCharging:是否要插入設(shè)備(接入電源),默認(rèn)false
         *  setRequiresDeviceIdle:設(shè)備是否為空閑,默認(rèn)false
         *  setRequiresStorageNotLow:設(shè)備可用存儲(chǔ)是否不低于臨界閾值
         */

        // 請(qǐng)求對(duì)象
        OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MainWorkManager2.class)
                .setConstraints(myConstraints)
                .build();

        // 測(cè)試:監(jiān)聽狀態(tài)
        // 監(jiān)聽狀態(tài)
        WorkManager.getInstance(this).getWorkInfoByIdLiveData(request.getId())
                .observe(this, new Observer<WorkInfo>() {
                    @Override
                    public void onChanged(WorkInfo workInfo) {
                        Log.d(MainWorkManager.TAG, "狀態(tài):" + workInfo.getState().name());
                        if (workInfo.getState().isFinished()) {
                            Log.d(MainWorkManager.TAG, "狀態(tài):isFinished=true 后臺(tái)任務(wù)已經(jīng)完成了...");
                        }
                    }
                });

        // 加入隊(duì)列
        WorkManager.getInstance(this).enqueue(request);
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容