AndroidX 之 使用WorkManager 解决后台任务

Android WorkManager

  • 使用 WorkManager Api 可以轻松的调度即使在应用退出或者设备重启时仍应运行的可延迟一步任务
  • 用统一的方法解决绝大部分后台问题
  • 在应用被强退的时候也能执行任务
    C:\Users\00\AppData\Roaming\Typora\typora-user-images\image-20200624181222641.png
一、使用
  • 引入 implementation 'androidx.work:work-runtime-ktx:2.4.0-beta01'
    
  • 在build.gradle 下添加
    
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    kotlinOptions{
        jvmTarget = 1.8
    }
    
简单的工作示例
class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    override fun doWork(): Result {
        Log.d("FanJava","start")
        Thread.sleep(3000)
        Log.d("FanJava","end")
        return Result.success()
//        return Result.failure()
    }
}
class MainActivity : AppCompatActivity() {
     //获取 引用
    private val workManager  = WorkManager.getInstance(this)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button.setOnClickListener {
            val workRequest = OneTimeWorkRequestBuilder<MyWorker>().build()
            workManager.enqueue(workRequest)
        }
    }
}
log
FanJava: start
FanJava: end
向工作任务传递参数,任务结束后观察传出的参数
class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    override fun doWork(): Result {
        val name = inputData.getString(INPUT_DATA_KEY)
        Log.d("FanJava","$name start")
        Thread.sleep(3000)
        Log.d("FanJava","$name end")
        return Result.success(workDataOf(OUTPUT_DATA_KEY to "$name success"))
//        return Result.failure()
    }
}
const val INPUT_DATA_KEY="input_data_key"
const val OUTPUT_DATA_KEY="output_data_key"
const val WORK_A_NAME="Work A"
const val WORK_B_NAME="Work B"
class MainActivity : AppCompatActivity() {
     //获取 引用
    private val workManager  = WorkManager.getInstance(this)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button.setOnClickListener {
            val constraints  = Constraints.Builder()
                    .setRequiredNetworkType(NetworkType.CONNECTED) //创建约束条件 “在联网的情况下” 执行
                    .build()
            val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
                    .setConstraints(constraints) // 将约束条件加入任务
                    .setInputData(workDataOf(Pair(INPUT_DATA_KEY, WORK_A_NAME))) //传递一些数据  Key / Value 类型的
//                    .setInputData(workDataOf(INPUT_DATA_KEY to WORK_A_NAME)) //传递一些数据  Key / Value 类型的
                    .build()
            workManager.enqueue(workRequest) //将任务加入队列,满足条件的时候会执行
            //在这里观察 执行状态
            workManager.getWorkInfoByIdLiveData(workRequest.id).observe(this, Observer {
                  Log.d("FanJava","onCreate:${it.state}")
                 if (it.state==WorkInfo.State.SUCCEEDED){
                     Log.d("FanJava","onCreate:${it.outputData.getString(OUTPUT_DATA_KEY)}")
                 }
            })
        }
    }
}
顺序执行任务
const val INPUT_DATA_KEY="input_data_key"
const val OUTPUT_DATA_KEY="output_data_key"
const val WORK_A_NAME="Work A"
const val WORK_B_NAME="Work B"
class MainActivity : AppCompatActivity() {
     //获取 引用
    private val workManager  = WorkManager.getInstance(this)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button.setOnClickListener {
            val workRequest_A = CreateWorkRequest(WORK_A_NAME)
            val workRequest_B = CreateWorkRequest(WORK_B_NAME)
            workManager.beginWith(workRequest_A) //执行多个任务顺序执行
                    .then(workRequest_B)
                    .enqueue()
        }
    }
    private fun CreateWorkRequest(name:String): OneTimeWorkRequest {
        val constraints = Constraints.Builder() 
                .setRequiredNetworkType(NetworkType.CONNECTED) //创建约束条件 “在联网的情况下” 执行
                .build()
        val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
                .setConstraints(constraints) // 将约束条件加入任务
                .setInputData(workDataOf(Pair(INPUT_DATA_KEY, name))) //传递一些数据  Key / Value 类型的
    //                    .setInputData(workDataOf(INPUT_DATA_KEY to WORK_A_NAME)) //传递一些数据  Key / Value 类型的
                .build()
        return workRequest
    }
}
以上介绍了 WorkManager 的基本使用,他在未来,很有可能承担起为所有后台任务,所以赶紧来试试吧!
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值