Android WorkerManager 应用帖
2018-08-14 本文已影响135人
7ff53e360bcc
需求
特定的时间更新首页状态,频率较低,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)