Android WorkerManager 应用帖

需求

特定的时间更新首页状态,频率较低,2次每天,时间不固定。

解决方案

Jetpack Architecture 增加了一个workerManager,帮我们兼容了不同的API level,并且可以根据手机当前的环境进行策略调整。
当App正在运行,会在App进程中开启一个线程进行任务执行。如果App没有运行,WorkerManger会根据不同的情况帮我们选择
AlarmManager、
JobScheduler、
Firebase JobDispatcher,来执行任务。

加入依赖

dependencies {
    def work_version = "1.0.0-alpha01"

    implementation "android.arch.work:work-runtime:$work_version" // use -ktx for Kotlin

    // optional - Firebase JobDispatcher support
    implementation "android.arch.work:work-firebase:$work_version"

}

创建Worker

此处执行我们的定时任务,我的需求仅仅是需要一个通知,则直接return WorkerResult.SUCCESS

public class HomeWorker extends Worker {

    @NonNull
    @Override
    public WorkerResult doWork() {
        return WorkerResult.SUCCESS;
    }
}

产生请求

将创建的任务,通过setInitialDelay来指定任务时间

 // 产生请求
            val request = OneTimeWorkRequest.Builder(HomeWorker::class.java)
                    .setInitialDelay(time, TimeUnit.SECONDS)
                    .build()

加入队列

将任务加入队列,等待执行。此处我是添加了多个任务。

WorkManager.getInstance().enqueue(requests)

查看结果

根据创建的request.id查找任务,若任务状态正确,可以在回调中进行处理。

WorkManager.getInstance().getStatusById(request.id)
                    .observe(context, Observer { workStatus ->
                        if (workStatus != null && workStatus.state.isFinished) {
                            // ...
                        }
                    })


其实上面就完成了最简单的使用,为大家补充几点。方便根据自己的情况进行扩展 。

  • Constraints:为执行环境进行设定,例如网络连接状态、电量情况。
  • PeriodicWorkRequest:循环任务
  • OneTimeWorkRequest:单次任务
  • Chain Task: begin()、then(),enqueue()

补充(坑)

最多同事存在100个任务。超过时直接crash。原因是因为cancel方法并不能及时生效。此处我是使用sp自己进行了管理。

            // 存在任务
            if (existWorker(context, it.liveId)) {
                return
            }

            // 产生请求
            val request = OneTimeWorkRequest.Builder(HomeWorker::class.java)
                    .setInitialDelay(time, TimeUnit.SECONDS)
                    .build()

            // 查看结果
            WorkManager.getInstance().getStatusById(request.id)
                    .observe(context, Observer { workStatus ->
                        if (workStatus != null && workStatus.state.isFinished) {
                            //移除任务
                            removeWorkerCache(context, it.liveId)                        }
                    })
            // 保存任务
            saveWorker(context, it.liveId, request.id)

            // 加入集合
            requests.add(request)

你可能感兴趣的:(Android WorkerManager 应用帖)