关于WorkManager的使用

关于WorkManager的使用

这是我的Github地址:https://github.com/brokes6
我的博客:https://brokes6.github.io/

本篇以Kotlin为主要语言

介绍

WorkManager是一个后台执行任务管理,即使在应用退出,也可以继续执行被创建的任务。还可以为WorkManager添加触发条件。当然还有特殊情况,当应用被彻底杀死的时候,任务是不会触发的,会等到下次应用开启,然后触发任务

  1. 添加依赖

    • 打开当前项目的ProjecySturcture

      image-20201224145447147

    • 在Dependencies.app中点击 + 来添加依赖,之后在Library Dependency中搜索androidx.work

      image-20201223092135741

    • 选择ktx结尾的,点击ok,等待下载完成

  2. 接下来创建一个类MyWorker 继承 Worker

    class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
        override fun doWork(): Result {
            Log.e("work", "doWork:  任务开始" )
            Thread.sleep(3000)
            Log.e("work", "doWork:  任务结束" )
            return Result.success()
        }
    }
    

    继承Worker 是需要传入参数,所以需要创建构造方法。这里为了方便观察,于是打印日志

  3. 然后再Activity中创建变量 workMananger,并且创建workRequest且传入

    class MainActivity : AppCompatActivity() {
        private val workManager = WorkManager.getInstance(this)
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            //这里在XML中创建了一个Button,为其设置点击事件
            button.setOnClickListener {
                val wrokRequest = OneTimeWorkRequestBuilder<MyWorker>()
                .build()
                workManager.enqueue(wrokRequest)
                //将创建好的workRequest传递给workManager
            }
        }
    }
    

    以上,关于workManager的简单使用就完成了

WorkManager的触发条件与传递数据、串接

触发条件
  val constraints = Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build()
 val wrokRequest = OneTimeWorkRequestBuilder<MyWorker>()
            .setConstraints(constraints)
            .build()

创建一个Constraints,并且给他设置触发条件为连接网络时触发,然后传递给workRequest

Constraints也就是用来设置触发条件,设置完触发条件之后就可以传递个wrokRequest,然后只要遇到指定的条件,Wroker就会触发

传递数据

可以将数据传递进Worker,Worker也可以把数据传递出来

val wrokRequest = OneTimeWorkRequestBuilder<MyWorker>()
			//触发条件
            .setConstraints(constraints)
			//传递数据进入Worker
            .setInputData(workDataOf(INTPUT_WORK_KEY to data))
            .build()

传递数据是通过setInputData,接受一个workData参数,workData是一个键值对,最后在Worker中接受数据

class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    override fun doWork(): Result {
        //通过inputData来获取传递进来的数据
        val data = inputData.getString("Key")
        //也可以通过Result.success来传递数据出去,当然也是workData类型
        return Result.success(workDataOf(OUT_WORK_KEY to "任务已结束"))
    }
}

通过inputData 来接受数据,并且可以通过return Success来传递出去数据,在Activity/Fragment中通过LiveData观察来获取数据

workManage.getWorkInfoByIdLiveData(workRequestA.id).observe(this, Observer {
                Toast.makeText(this, "任务完成,返回数据为${it.outputData}", Toast.LENGTH_SHORT).show()
            })
串接

首先,我们先将创建触发条件与创建workRequest的内容提取出来(快捷键为:ctrl+alt+m)

private fun createWork(data: String): OneTimeWorkRequest {
        val constraints = Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build()
        return OneTimeWorkRequestBuilder<MyWorker>()
            .setConstraints(constraints)
            .setInputData(workDataOf(INTPUT_WORK_KEY to data))
            .build()
    }

并且给这个方法传入一个参数,用来进行与Worker之间传递数据,然后使用

  private val WORK_A_DATA = "A ni shi han han"
  private val WORK_B_DATA = "B ni shi han han"

  val workRequestA = createWork(WORK_A_DATA)
  val workRequestB = createWork(WORK_B_DATA)
      workManager.beginWith(workRequestA)
          .then(workRequestB)
          .enqueue()

之后就可以使用workManager.beginWith()将两个worker串接起来,beginWith()是传入第一个workRequest,剩下的通过then来传递,最后别忘了调用enqueue()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值