王学岗移动架构(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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值