Jetpack WorkManager:后台任务别再只会Service了!

共 7527字,需浏览 16分钟

 ·

2021-10-18 18:47

定义

JetPack中的一个组件:工作管理器。


特点

保证任务一定会被执行。(即使应用程序不在运行中/重启后)

原因:WorkManager会把任务相关的数据、信息都存储到自己的数据库里

具体使用

主要包括:基础使用、链式任务使用、周期性使用和数据传递。

注:需先加依赖

// 1. 增加依赖
implementation "androidx.work:work-runtime:2.6.0-beta01"

1. 基础使用

// 1. 创建任务
// 继承Worker同时实现doWork():后续执行的任务会在这个方法里进行
public class carsonTestWork extends Worker {

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

    @NonNull
    @Override
    public Result doWork() {
        Log.e("carsonho","执行完成");
        return Result.success();
        // 返回值类型为Result,有三种状态:
        // 执行成功:Result.success()
        // 执行失败:Result.failure() 
        // 需要重新执行:Result.retry() 
    }
}

// 2. 执行任务(外部调用)
OneTimeWorkRequest oneTimeWorkRequest =new OneTimeWorkRequest.Builder(carsonTestWork.class).build();
WorkManager.getInstance(this).enqueue(oneTimeWorkRequest); // 正常执行

OneTimeWorkRequest oneTimeWorkRequest =new OneTimeWorkRequest.Builder(carsonTestWork.class)..setInitialDelay(2, TimeUnit.SECONDS).build();
WorkManager.getInstance(this).enqueue(oneTimeWorkRequest); // 延迟执行

2. 链式执行任务

即连续执行多个任务,通过beginWith 跟 then设置。

// 1. 创建任务
public class carsonTestWork extends Worker {

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

    @NonNull
    @Override
    public Result doWork() {
        Log.e("carsonho","执行完成");
        return Result.success();
    }
}

// 2. 链式执行一系列任务
ArrayList<OneTimeWorkRequest> workerRequests = new ArrayList();
// 任务1
OneTimeWorkRequest oneTimeWorkRequest1 = new OneTimeWorkRequest.Builder(carsonTestWork.class).build();
// 任务2
OneTimeWorkRequest oneTimeWorkRequest2 = new OneTimeWorkRequest.Builder(carsonTestWork.class).build();
// 存储到集合里
workerRequests.add(oneTimeWorkRequest1);
workerRequests.add(oneTimeWorkRequest2);

// 任务3
OneTimeWorkRequest oneTimeWorkRequest3 = new OneTimeWorkRequest.Builder(carsonTestWork.class).build();

// 通过beginWith 跟 then设置先后执行的任务
WorkManager.getInstance(this)
        .beginWith(workerRequests)//先执行的任务
        .then(oneTimeWorkRequest3)//后执行的任务
        .enqueue();

3. 周期性任务

即重复循环执行任务,采用PeriodicWorkRequest实现。(上述提到的任务OneTimeWorkRequest属于一次性执行任务)

// 1. 创建任务
public class carsonTestWork extends Worker {

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

    @NonNull
    @Override
    public Result doWork() {
        Log.e("carsonho","执行完成");
        return Result.success();
    }
}

// 2. 执行周期性任务任务
PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest
                .Builder(PeriodicWork.class,15,TimeUnit.MINUTES) // 注:间隔不能少于15min
                .build();
WorkManager.getInstance(this).enqueue(periodicWorkRequest);

4. 数据传递

// 1. activity向Worker传递数据
// 通过setInputData()
    Data data = new Data.Builder().putString("data","Activity传过来的数据").build();
    OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(carsonTestWork.class)
                    .setInputData(data)
                    .build();
    WorkManager.getInstance(this).enqueue(oneTimeWorkRequest);

    // 监听Worker回传的数据
    WorkManager.getInstance(this)
            .getWorkInfoByIdLiveData(oneTimeWorkRequest.getId())
            .observe(this, new Observer<WorkInfo>() {
                @Override
                public void onChanged(WorkInfo workInfo) {
                    if(workInfo.getState().isFinished()){
                        Data outputData = workInfo.getOutputData();
                    }
                }
            });

// 2. Worker回传数据
// 放在复写的doWork()里的返回参数即可。
public class carsonTestWork extends Worker {

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

    @NonNull
    @Override
    public Result doWork() {
        String activityData = getInputData().getString("data");
        Data data = new Data.Builder().putString("data","Worker回传的数据").build();
        return Result.success(data);
}

「Carson每天带你学习一个Android知识点」,长按扫描关注公众号。同时,期待您精彩文章的投稿:真诚邀请您来分享

最后福利:学习资料赠送

  • 福利:由本人亲自撰写 & 整理的「Android学习方法资料」
  • 数量:10名
  • 参与方式:「点击文章右下角”在看“ -> 回复截图到公众号 即可,我将从中随机抽取」

    点击“在看”就能升职 & 加薪水哦!
浏览 15
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐