49. WorkManager的使用和原理

时间:2021-7-3 作者:qvyue

简介

WorkManger是Android Jetpack提供执行后台任务管理的组件,它适用于需要保证 系统即使应用程序退出也会运行的任务,WorkManager API可以轻松指定可延迟的 异步任务以及何时运行它们,这些API允许您创建任务并将其交给WorkManager立 即运行或在适当的时间运行。
WorkManager根据设备API级别和应用程序状态等因素选择适当的方式来运行任 务。如果WorkManager在应用程序运行时执行您的任务之一,WorkManager可以 在您应用程序进程的新线程中运行您的任务。如果您的应用程序未运行, WorkManager会选择一种合适的方式来安排后台任务 – 具体取决于设备API级别和包 含的依赖项,WorkManager可能会使用 JobScheduler,Firebase JobDispatcher或 AlarmManager

WorkManager作用

一:确保重要的后台任务,一定会被执行,后台任务(例如:非及时性的 (请求服 务器 及时性) 上传,下载,同步数据 等)
二:内部对电量进行了优化,不需要我们去处理电量优化了
三:API 14 到 最新版本,都可以使用WorkManager来管你你的后台任务
四:注意:WorkManager不能做保活操作 (重复执行后台任务的最少执行单位是 15分钟,源码内部限制)

WorkManager的各个角色

Worker:指定需要执行的任务,可以成为Workder类的子类,在实
现的方法中,就可以执行任务逻辑了
WorkRequest:执行一项单一的任务
第一点:必须知道 WorkRequest对象,必须指定Work执行的任务
第二点:需要知道 WorkRequest都有一个自动生成的唯一ID,可以使用ID执行取消 排队任务 或 获取任务状态等操作
第三点:需要知道 WorkRequest是一个抽象的类;系统默认实现子类 OneTimeWorkRequest或PeriodicWorkRequest
第四点:需要知道 WorkRequest.Builder创建WorkRequest对象;相应的子类: OneTimeWorkRequest.Builder或PeriodicWorkRequest.Builder
第五点:需要知道 Constraints:指定对任务运行时间的限制(任务约束);使用 Constraints.Builder创建Constraints对象 ,并传递给WorkRequest.Builder

主线流程

49. WorkManager的使用和原理

使用方式

implementation "androidx.work:work-runtime:2.3.4"

1.创建一个任务
创建一个类,继承自Worker

public class MainWorker1 extends Worker {

    private final static String TAG = MainWorker1.class.getSimpleName();

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

    // 后台任务 并且 异步的
    @NonNull
    @Override
    public Result doWork() {
        Log.d(TAG, "MainWorker1 doWork: run started ... ");
        try {
            Thread.sleep(8000); // 睡眠
        } catch (InterruptedException e) {
            e.printStackTrace();
            return Result.failure(); // 本次任务失败
        } finally {
            Log.d(TAG, "MainWorker1 doWork: run end ... ");
        }
        return Result.success(); // 本次任务成功
    }
}

2.执行任务

OneTimeWorkRequest oneTimeWorkRequest =
                new OneTimeWorkRequest.Builder(MainWorker1.class).build();
WorkManager.getInstance(this).enqueue(oneTimeWorkRequest);
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。