王學崗移動架構(46)————jetpack技術之WorkManager

作用:1,確保重要的後臺任務一定會執行
比如下載的時候手機沒電了,這種情況下workManager已經做了處理
2,省電

添加依賴

    //workmanager
    implementation "android.arch.work:work-runtime:1.0.0-alpha06"

第一,先看一個簡單的例子

package com.example.workmanagertest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.work.Data;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;
import androidx.work.WorkStatus;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    //單次執行,worker只執行一次
    OneTimeWorkRequest request;
    public static final String WORKERKEY = "zhang_xin";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //在Activity開啓任務,可以傳入數據到任務
       Data data = new Data.Builder().putString(WORKERKEY,"張欣愛王學崗一生一世").build();
        //初始化OneTimeWorkRequest
        request = new OneTimeWorkRequest.Builder(MainWork.class).setInputData(data).build();
        //把任務加入到任務隊列中,並在滿足某種條件的情況下執行
        WorkManager.getInstance().enqueue(request);
        //接收任務中回來的數據
        //任務很多,根據ID判斷是哪個任務回傳的數據
        WorkManager.getInstance().getStatusById(request.getId()).observe(this, new Observer<WorkStatus>() {
            @Override
            public void onChanged(WorkStatus workStatus) {
                if(workStatus!=null && workStatus.getState().isFinished()){
                    //任務完成後取數據
                    String data = workStatus.getOutputData().getString(MainWork.HUICHUANDATA);
                    Log.i("zhang_xin","回傳到Activity的數據:"+data);
                }
            }
        });
    }
}

package com.example.workmanagertest;

import android.util.Log;

import androidx.annotation.NonNull;
import androidx.work.Data;
import androidx.work.Worker;

public class MainWork extends Worker {
    public final static String HUICHUANDATA = "huichuandedata";
    //這個方法是在子線程執行的
    @NonNull
    @Override
    public Result doWork() {
        //這裏面可以做很多事情,比如上傳,下載,同步數據。。。。。。
        Log.i("zhang_xin","doWork......");
        String data = getInputData().getString(MainActivity.WORKERKEY);
        Log.i("zhang_xin","work收到的數據:"+data);
        //把任務中的數據回傳到activity中
        Data backData = new Data.Builder().putString(HUICHUANDATA,"完成了,這是回傳的數據").build();
        setOutputData(backData);
          return Result.SUCCESS;
    }
}

看下打印輸出

2020-02-10 20:01:13.227 2628-2719/com.example.workmanagertest I/zhang_xin: doWork......
2020-02-10 20:01:13.227 2628-2719/com.example.workmanagertest I/zhang_xin: work收到的數據:張欣愛王學崗一生一世
2020-02-10 20:01:13.333 2628-2628/com.example.workmanagertest I/zhang_xin: 回傳到Activity的數據:完成了,這是回傳的數據

第二 定義多個任務,創建任務鏈

舉個例子,我們上傳圖片之前要先寫一個濾鏡,在對圖片壓縮,最後上傳。
創建四個Worker

package com.example.workmanagertest;

import android.util.Log;

import androidx.annotation.NonNull;
import androidx.work.Worker;

public class MainWork1 extends Worker {
    public final static String HUICHUANDATA = "huichuandedata";
    //這個方法是在子線程執行的
    @NonNull
    @Override
    public Result doWork() {
        //這裏面可以做很多事情,比如上傳,下載,同步數據。。。。。。
        Log.i("zhang_xin","work1執行了");
          return Result.SUCCESS;
    }
}

package com.example.workmanagertest;

import android.util.Log;

import androidx.annotation.NonNull;
import androidx.work.Worker;

public class MainWork2 extends Worker {
    public final static String HUICHUANDATA = "huichuandedata";
    //這個方法是在子線程執行的
    @NonNull
    @Override
    public Result doWork() {
        //這裏面可以做很多事情,比如上傳,下載,同步數據。。。。。。
        Log.i("zhang_xin","work2執行了");
          return Result.SUCCESS;
    }
}

package com.example.workmanagertest;

import android.util.Log;

import androidx.annotation.NonNull;
import androidx.work.Worker;

public class MainWork3 extends Worker {
    public final static String HUICHUANDATA = "huichuandedata";
    //這個方法是在子線程執行的
    @NonNull
    @Override
    public Result doWork() {
        //這裏面可以做很多事情,比如上傳,下載,同步數據。。。。。。
        Log.i("zhang_xin","work3執行了");
          return Result.SUCCESS;
    }
}

package com.example.workmanagertest;

import android.util.Log;

import androidx.annotation.NonNull;
import androidx.work.Worker;

public class MainWork4 extends Worker {
    public final static String HUICHUANDATA = "huichuandedata";
    //這個方法是在子線程執行的
    @NonNull
    @Override
    public Result doWork() {
        //這裏面可以做很多事情,比如上傳,下載,同步數據。。。。。。
        Log.i("zhang_xin","work4執行了");
          return Result.SUCCESS;
    }
}

在MainActivity中調用

package com.example.workmanagertest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.work.Data;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;
import androidx.work.WorkStatus;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    //單次執行,worker只執行一次
    OneTimeWorkRequest request1;
    OneTimeWorkRequest request2;
    OneTimeWorkRequest request3;
    OneTimeWorkRequest request4;
    public static final String WORKERKEY = "zhang_xin";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //在Activity開啓任務,可以傳入數據到任務
       Data data = new Data.Builder().putString(WORKERKEY,"張欣愛王學崗一生一世").build();
        request1 = new OneTimeWorkRequest.Builder(MainWork1.class).setInputData(data).build();
        WorkManager.getInstance().enqueue(request1);
        request2 = new OneTimeWorkRequest.Builder(MainWork2.class).setInputData(data).build();
        WorkManager.getInstance().enqueue(request2);
        request3 = new OneTimeWorkRequest.Builder(MainWork3.class).setInputData(data).build();
        WorkManager.getInstance().enqueue(request3);
        request4 = new OneTimeWorkRequest.Builder(MainWork4.class).setInputData(data).build();
        WorkManager.getInstance().enqueue(request4);
    }
}

看下打印輸出

2020-02-10 20:11:03.252 3865-3940/com.example.workmanagertest I/zhang_xin: work3執行了
2020-02-10 20:11:03.260 3865-3939/com.example.workmanagertest I/zhang_xin: work2執行了
2020-02-10 20:11:03.268 3865-3941/com.example.workmanagertest I/zhang_xin: work4執行了
2020-02-10 20:11:03.275 3865-3938/com.example.workmanagertest I/zhang_xin: work1執行了

我們發現它的執行是無序的
現在我們讓它有順序的執行

package com.example.workmanagertest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.work.Data;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;
import androidx.work.WorkStatus;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    //單次執行,worker只執行一次
    OneTimeWorkRequest request1;
    OneTimeWorkRequest request2;
    OneTimeWorkRequest request3;
    OneTimeWorkRequest request4;
    public static final String WORKERKEY = "zhang_xin";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //在Activity開啓任務,可以傳入數據到任務
        Data data = new Data.Builder().putString(WORKERKEY, "張欣愛王學崗一生一世").build();
        request1 = new OneTimeWorkRequest.Builder(MainWork1.class).setInputData(data).build();
        request2 = new OneTimeWorkRequest.Builder(MainWork2.class).setInputData(data).build();
        request3 = new OneTimeWorkRequest.Builder(MainWork3.class).setInputData(data).build();
        request4 = new OneTimeWorkRequest.Builder(MainWork4.class).setInputData(data).build();
        //1,順序執行
        WorkManager.getInstance().beginWith(request1).then(request2).then(request3).then(request4).enqueue();
    }
}

看下打印輸出

2020-02-10 20:20:23.626 4780-4814/? I/zhang_xin: work1執行了
2020-02-10 20:20:23.690 4780-4818/? I/zhang_xin: work2執行了
2020-02-10 20:20:23.743 4780-4819/? I/zhang_xin: work3執行了
2020-02-10 20:20:23.786 4780-4820/? I/zhang_xin: work4執行了

我們現在讓1和3先執行,2和四在執行

  WorkManager.getInstance().beginWith(request1,request3).then(request2,request4).enqueue();

看下打印輸出

2020-02-10 20:23:18.590 5030-5091/com.example.workmanagertest I/zhang_xin: work3執行了
2020-02-10 20:23:18.601 5030-5090/com.example.workmanagertest I/zhang_xin: work1執行了
2020-02-10 20:23:18.728 5030-5113/com.example.workmanagertest I/zhang_xin: work2執行了
2020-02-10 20:23:18.737 5030-5090/com.example.workmanagertest I/zhang_xin: work4執行了

任務鏈的方式

  WorkContinuation then1 = WorkManager.getInstance().beginWith(request1).then(request2);
  WorkContinuation then2 = WorkManager.getInstance().beginWith(request4).then(request5);
  WorkContinuation.combine(then1,then2).then(request3).enqueue();

打印輸出1和4執行,其次是2和5,最後是3.

任務的唯一性,同一個任務被加入裏隊列兩次以上,會對此執行,如果我們不想多次執行,可以這麼寫

        WorkManager.getInstance()
                .beginUniqueWork("unique", ExistingWorkPolicy.REPLACE
                            ,request1).enqueue();

重複任務

        PeriodicWorkRequest periodicWorkRequest;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //復重任務,每隔一天執行一次
        periodicWorkRequest=new PeriodicWorkRequest.Builder(
                       MainWorker.class,1, TimeUnit.DAYS
        ).build();
}

約束條件

  Constraints constraints = new Constraints.Builder()
                //網絡類型
                .setRequiredNetworkType(NetworkType.CONNECTED)
                //電量是否充足
                .setRequiresBatteryNotLow(true)
                //在待機狀態下執行
                .setRequiresDeviceIdle(true)
                //在存儲空間不足的時候
                .setRequiresStorageNotLow(true)
                //充電
                .setRequiresCharging(true)
                .build();
 request=new OneTimeWorkRequest.Builder(MainWorker.class)
                .setInputData(inputData)
                .setConstraints(constraints)
                .build();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章