android WorkManger 使用攻略

WorkManager 使用攻略

WorkManagerAndroid JetPack 的一部分。是用于执行后台任务的。

导入依赖库

对应的库:implementation "android.arch.work:work-runtime:1.0.1"

最简单的WorkerManager

一个简单的 WorkManger 执行,需要包含一个Worker, 一个WorkRequest.
比如:

public class MouseWorker extends Worker {
    public MouseWorker(@NonNull Context context, 
                       @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        // 子线程
        LogUtils.e(Thread.currentThread().getName());
        return Result.success();
    }
}
// 执行该  worker
WorkManager.getInstance().enqueue(new OneTimeWorkRequest.Builder(MouseWorker.class).build());

这里的 doWork()的返回值Result,除了 Result.success();还有 失败与重试两种不同的结果。

添加一些配置选项
// Create a Constraints object that defines when the task should run
Constraints constraints = new Constraints.Builder()
    .setRequiresDeviceIdle(true)
    .setRequiresCharging(true)
     .build();

// ...then create a OneTimeWorkRequest that uses those constraints
OneTimeWorkRequest compressionWork =
                new OneTimeWorkRequest.Builder(CompressWorker.class)
     .setConstraints(constraints) // 添加约束
     .build();

OneTimeWorkRequest uploadWorkRequest = new OneTimeWorkRequest.Builder(UploadWorker.class)
        .setInitialDelay(10, TimeUnit.MINUTES) // 延时执行
        .build();

这里的 Constraints提供了好几个 set方法,比如,是不是充电中这些。

监听Worker的执行情况
WorkManager.getInstance().getWorkInfoByIdLiveData(uploadWorkRequest.getId())
        .observe(lifecycleOwner, new Observer<WorkInfo>() {
            @Override
            public void onChanged(@Nullable WorkInfo workInfo) {
              if (workInfo != null && workInfo.state == WorkInfo.State.SUCCEEDED) {
                  displayMessage("Work finished!")
              }
            }
        });
//  lifecycleOwner 是一个接口, AppCompatActivity, Fragment 都实现了这个接口
// 所以,如果是在 activity 里面监听,可以直接传入 this.
关联多个任务一起执行
WorkManager.getInstance()
    // Candidates to run in parallel
    .beginWith(Arrays.asList(filter1, filter2, filter3))  // 这里的 1,2,3 会被并行执行
    // Dependent work (only runs after all previous work in chain)
    .then(compress) // 然后执行该任务
    .then(upload) // 然后执行该任务
    // Don't forget to enqueue()
    .enqueue();

这个有点类型很多 pipline工具里面配置,可以并行,可以串行。可以先串行 1,2,3然后并行4,5,最后再串行一个 6.

取消一个未完成的任务
WorkManager.cancelWorkById(workRequest.getId());

// 还有好几个cancleXXX() 的方法,参数不同。
执行周期性任务
Constraints constraints = new Constraints.Builder()
        .setRequiresCharging(true)
        .build();

PeriodicWorkRequest saveRequest =
        new PeriodicWorkRequest.Builder(SaveImageFileWorker.class, 1, TimeUnit.HOURS)
                  .setConstraints(constraints)
                  .build();

WorkManager.getInstance()
    .enqueue(saveRequest);
执行“特殊”任务
OneTimeWorkRequest oneWorkRequest = new OneTimeWorkRequest.Builder(OneWorker.class)
                            .setInputMerger(ArrayCreatingInputMerger.class).build();
                    String uniqueWorkName = "unique";
                    WorkManager.getInstance()
                            .enqueueUniqueWork(uniqueWorkName, ExistingWorkPolicy.APPEND,
                                    oneWorkRequest);

这里的“特殊”任务,特殊的地方就是需要一个新的参数:ExistingWorkPolicy ,这是一个枚举值。分别代表不同的含义。如果上一个名字相同的特殊任务没有执行完成,那么现在要怎么做? 3个值见名知意,非常容易理解。

特殊任务也是可以串行与并行多个的。调用方式是
WorkManager.getInstance().beginUniqueWork(xxx) ...;
WorkManager.getInstance().enqueueUniqueWork(xx)...

自定义WorkManager初始化参数
  1. 去掉默认初始值:
        <provider
            android:name="androidx.work.impl.WorkManagerInitializer"
            android:authorities="${applicationId}.workmanager-init"
            tools:node="remove" />
  1. 自定义自己的初始值:
public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Configuration configuration = new Configuration.Builder()
                .setExecutor(Executors.newFixedThreadPool(8)) // 设置 Workmanager 的后台线程
                .build();
        WorkManager.initialize(this, configuration);
    }
}

// 官方文档 的操作,可是我本地死活找不到 Configuration.Provider 这个类
class MyApplication extends Application implements Configuration.Provider {
    @Override
    public Configuration getWorkManagerConfiguration() {
        return Configuration.Builder()
                .setMinimumLoggingLevel(android.util.Log.INFO)
                .build();
    }
}

ps: 从文档来看,WorkerManagerJobScheduler 没有直接的关联。使用上,也不一定要互相关联。

参考链接:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值