美文网首页
Android WorkerManager 应用帖

Android WorkerManager 应用帖

作者: 7ff53e360bcc | 来源:发表于2018-08-14 15:51 被阅读135次

    需求

    特定的时间更新首页状态,频率较低,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 应用帖

          本文链接:https://www.haomeiwen.com/subject/rwsvbftx.html