轻松管理你的后台任务—WorkManager(使用篇)

Jetpack 是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。Jetpack 包含与平台 API 解除捆绑的 androidx.* 软件包库。这意味着,它可以提供向后兼容性,且比 Android 平台的更新频率更高,以此确保您始终可以获取最新且最好的 Jetpack 组件版本。
结合自己的阅读源码、实战经历总结。记录分享一下。

  • 轻松管理你的后台任务—WorkManager(使用篇)
  • 轻松管理你的后台任务—WorkManager(进阶篇)
  • Android项目组件化/模块化,用LiveData打造属于你组件通信框架EventBus
  • 还在等什么,用LiveData手撸一个Retrofit吧
  • 未完待续,也可以踊跃投稿至【[深入浅出Android-Jetpack系列】

预备知识

1.Android 基础知识
2.LiveData基本了解和使用
3.Room数据库的基本了解和使用

读完本文可以学到什么

  1. 认识高效后台任务管理框架-WorkManager
  2. WorkManager的使用以及经典场景

一、认识高效后台任务管理框架-WorkManager

WorkManager是google推出来的Jetpack大家族中的一员,他能够轻松的执行可延期的异步任务,甚至在app退出或者设备重启都不中断你的任务。

关键特征:

  • 兼容到API14。
    • 在API 23及其以上使用Job JobScheduler。
    • 在API 14-22使用 BroadcastReceiver + AlarmManager。
  • 为任务添加约束,比如网络连接、充电中、存储空间充足时等。
  • 任务可以选择只执行一次或者周期执行。
  • 监控和管理你的任务。
  • 可以执行任务链。
  • 执行任务甚至在app退出和设备重启时。
    *让你的设备尽可能的省电、比如Doze模式。

这段是从官网翻译过来的。当然我的梦想不是当一名翻译官,哈哈。下面介绍一下WorkManager的工作流程。


我用Axure画了张图,凑合着看看吧。首先构造一个包含Worker的WorkRequest,可以为WorkRequest添加输入数据(Data)、添加约束、BackOff、Tag等。然后交给WorkManager去enqueue。先将任务存储到Room,然后WorkManager根据系统api选择合适的任务调度器去执行任务。执行任务的时候会变更Room数据库任务的状态,Room与LiveData结合,我们就可以拿到监听到状态去作出相应的处理了。

WorkManager的使用以及经典场景

WorkManager的使用还是非常简单的。这里为了避免篇幅不大段大段的贴代码了。首先创建个Worker

public class UploadWorker extends Worker {

    public UploadWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
        super(context, params);
    }

    @Override
    public Result doWork() {

        // Get the input
        String imageUriInput = getInputData().getString(Constants.KEY_IMAGE_URI)
        // TODO: validate inputs.
        // Do the work
        Response response = uploadFile(imageUriInput)

        // Create the output of the work
        Data outputData = new Data.Builder
                .putString(Constants.KEY_IMAGE_URL, response.imageUrl)
                .build();

        // Return the output
        return Result.success(outputData)
    }
}

然后构建WorkRequest,入队。更多详细的用法可以去查看官网。直戳官方方法指南。

Data imageData = new Data.Builder
                .putString(Constants.KEY_IMAGE_URI, imageUriString)
                .build();

// Create a Constraints object that defines when the task should run
Constraints constraints = new Constraints.Builder()
    .setRequiresDeviceIdle(true)
    .setRequiresCharging(true)
     .build();

OneTimeWorkRequest uploadWorkRequest = new OneTimeWorkRequest.Builder(UploadWorker.class)
        .setInitialDelay(10, TimeUnit.MINUTES)
        .setBackoffCriteria(
                BackoffPolicy.LINEAR,
                OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
                TimeUnit.MILLISECONDS)
        .setInputData(imageData)
        .setConstraints(constraints)
        .build();

//入队
WorkManager.getInstance().beginWith(uploadWorkRequest).enqueue();
//监听
WorkManager.getInstance().getWorkInfoByIdLiveData(uploadWorkRequest.getStringId()).observe(this, new Observer() {
            @Override
            public void onChanged(@Nullable WorkInfo workInfo) {
                
            }
        });

下面要重点说说使用场景了。WorkManager适用于那些在应用退出之后任务还需要继续执行的需求,对应那些在应用退出的之后任务也需要终止的情况就需要选择ThreadPool来实现。 这个非常重要。比如上传日志、定时任务等可以选择WorkManager。当然博主不建议大家在商业项目上用WorkManger,oppo/vivo等厂商尤其是OPPO对app功耗问题把控的非常严格,具体原因在下篇源码篇会分享,顺带填一下遇到的坑。

你可能感兴趣的:(轻松管理你的后台任务—WorkManager(使用篇))