是时候更新手里的武器了—Jetpack架构组件简析( 七 )

()fun select(item: User) {userData.value = item}override fun onCleared() {super.onCleared()}}class MyFragment1 : Fragment() {private lateinit var btn: Buttonoverride fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)val model=activity?.let { ViewModelProvider(it).get(SharedViewModel::class.java) }btn.setOnClickListener{model?.select(User(0,"bob"))}}}class MyFragment2 : Fragment() {private lateinit var btn: Buttonoverride fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)val model=activity?.let { ViewModelProvider(it).get(SharedViewModel::class.java) }model?.userData?.observe(viewLifecycleOwner, Observer { item ->// Update the UI})}}Fragment中 , 获取到viewmodel的实例 , 然后进行数据监听等操作 。等等 , 你能发现什么不? 对了 , 数据通信 。不同的 Fragment 可以使用其父Activity共享ViewModel 来进行数据的通信 , 厉害吧 。还有很多其他的用法 , 去项目中慢慢发现吧!
WorkManager

使用 WorkManager API 可以轻松地调度即使在应用退出或设备重启时仍应运行的可延迟异步任务 。
听听这个介绍就很神奇了 , 应用退出和设备重启都能自动运行?通过广播?那数据又是怎么保存的呢?听说还可以执行周期性异步任务 , 顺序链式调用哦!接下来一一解密
一般这个API应用到什么场景呢?想想 , 可靠运行 , 还可以周期异步 。对了 , 发送日志 。可以通过WorkManager设定周期任务 , 每天执行一次发送日志的任务 。而且能够保证你的任务可靠运行 , 一定可以上传到 , 当然也是支持监听任务结果等 。:
1)导入库
dependencies {def work_version = "2.3.4"// Kotlin + coroutinesimplementation "androidx.work:work-runtime-ktx:$work_version"// optional - RxJava2 supportimplementation "androidx.work:work-rxjava2:$work_version"// optional - GCMNetworkManager supportimplementation "androidx.work:work-gcm:$work_version"}2) 新建任务类 , 继承Worker , 重写doWork方法 , 返回任务结果 。
class UploadLogcatWork(appContext: Context, workerParams: WorkerParameters) :Worker(appContext, workerParams) {override fun doWork(): Result {if (isUploadLogcatSuc()) {return Result.success()} else if (isNeedRetry()){return Result.retry()}return Result.failure()}fun isUploadLogcatSuc(): Boolean {var isSuc: Boolean = falsereturn isSuc}fun isNeedRetry(): Boolean {var isSuc: Boolean = falsereturn isSuc}}3)最后就是设定约束(是否需要网络 , 是否支持低电量 , 是否支持充电执行 , 延迟等等) , 执行任务(单次任务或者循环周期任务)
//设定约束val constraints =Constraints.Builder()//网络链接的时候使用.setRequiredNetworkType(NetworkType.CONNECTED)//是否在设备空闲的时候执行.setRequiresDeviceIdle(false)//是否在低电量的时候执行.setRequiresBatteryNotLow(true)//是否在内存不足的时候执行.setRequiresStorageNotLow(true)//是否时充电的时候执行.setRequiresCharging(true)//延迟执行.setTriggerContentMaxDelay(1000 * 1, TimeUnit.MILLISECONDS).build()//设定循环任务val uploadRequest =PeriodicWorkRequestBuilder<UploadLogcatWork>(1, TimeUnit.HOURS).setConstraints(constraints).addTag("uploadTag").build()//执行WorkManager.getInstance(applicationContext).enqueue(uploadRequest)//监听执行结果WorkManager.getInstance(this)//.getWorkInfosByTagLiveData("uploadTag") //通过tag拿到work.getWorkInfoByIdLiveData(uploadRequest.id) //通过id拿到work.observe(this, Observer {it?.apply {when (this.state) {WorkInfo.State.BLOCKED -> println("BLOCKED")WorkInfo.State.CANCELLED -> println("CANCELLED")WorkInfo.State.RUNNING -> println("RUNNING")WorkInfo.State.ENQUEUED -> println("ENQUEUED")WorkInfo.State.FAILED -> println("FAILED")WorkInfo.State.SUCCEEDED -> println("SUCCEEDED")else -> println("else status ${this.state}")}}})4)另外还支持任务取消 , 任务链式顺序调用等
//取消fun cancelWork(){WorkManager.getInstance(applicationContext).cancelAllWorkByTag("uploadTag")}fun startLineWork(){//图片滤镜1val filter1 = OneTimeWorkRequestBuilder<UploadLogcatWork>().build()//图片滤镜2val filter2 = OneTimeWorkRequestBuilder<UploadLogcatWork>().build()//图片压缩val compress = OneTimeWorkRequestBuilder<UploadLogcatWork>().build()//图片上传val upload = OneTimeWorkRequestBuilder<UploadLogcatWork>().build()WorkManager.getInstance(applicationContext).beginWith(listOf(filter1, filter2)).then(compress).then(upload).enqueue()}


推荐阅读