当前位置: 首页 > news >正文

多城市网站开发360网站提交收录入口

多城市网站开发,360网站提交收录入口,网页升级访问升级,自己建一个网站需要什么WorkManager入门 上一篇前言创建 WorkRequest并提交 定时的任务#xff08;PeriodicWorkRequest#xff09;配合约束使用定义执行范围失败后的重试为WorkRequest打上TAG其他取消方法 传参和返回参数总结参考资料 上一篇 Android WorkManager入门#xff08;一#xff09; … WorkManager入门 上一篇前言创建 WorkRequest并提交 定时的任务PeriodicWorkRequest配合约束使用定义执行范围失败后的重试为WorkRequest打上TAG其他取消方法 传参和返回参数总结参考资料 上一篇 Android WorkManager入门一 前言 在当今快节奏的生活中移动设备已经成为我们日常工作和生活不可或缺的一部分。然而随着应用程序的复杂性不断增加开发人员面临着一个重要的挑战如何在后台执行任务而不会影响用户的体验和设备的性能 在过去开发人员通常使用传统的后台服务或定时任务来解决这个问题。然而这些方法往往很复杂需要大量的代码和资源并且很难管理和调度任务。幸运的是谷歌最近推出了一个新的解决方案安卓WorkManager。 安卓WorkManager是一个灵活、强大的后台任务调度库旨在帮助开发人员轻松管理和执行后台任务。它提供了一种简单的方式来调度任务无论是一次性任务、定期任务还是延迟任务都可以很容易地实现。同时WorkManager还提供了一系列强大的功能如任务链、约束条件和灵活的重试机制以确保任务能够在最佳的时间和条件下执行。 在本文中我们将深入探讨安卓WorkManager的原理和用法并通过实际示例演示如何使用它来解决常见的后台任务问题。无论您是一名初学者还是一名有经验的开发人员本文都将为您提供宝贵的知识和实用的技巧帮助您更好地利用安卓WorkManager来优化您的应用程序。让我们一起开始这段关于安卓WorkManager的探索之旅吧 好吧不多BB其实是因为安卓12以上想起后台服务必须要悬浮窗权限想起还有个WorkManager这种东西去官网学习然后总结一下。没有看入门一的可以先看一或者看官网的也可以。 创建 WorkRequest并提交 定时的任务PeriodicWorkRequest 我们可能要定期备份数据、定期下载应用中的新鲜内容或者定期上传日志到服务器。就可以使用PeriodicWorkRequest 在使用之前我们除了接入依赖还需要新建一个worker import android.content.Context import android.util.Log import androidx.work.Worker import androidx.work.WorkerParametersclass MyWorker(appContext: Context, workerParams: WorkerParameters):Worker(appContext, workerParams) {companion object{private const val TAG MyWorker}override fun doWork(): Result {Log.d(TAG, doWork: 我正在做一些工作)return Result.success()}}然后我们在需要使用的地方加上下例代码 val mWorkerRequest4 PeriodicWorkRequestBuilderMyWorker(1, TimeUnit.HOURS).build()//通过WorkManager提交WorkRequest执行MyWorkerWorkManager.getInstance(this).enqueue(mWorkerRequest4) 可以定义的最短重复间隔是 15 分钟与 JobScheduler API 相同。 然后我们运行项目等待一小时… ok一分钟过去了然后我们发现一跑起来其实就有日志输出了所以这个时间其实是最小间隔时间和setInitialDelay的延时是不一样的。 配合约束使用 这时我们加上一个约束这时代码变成了下例这样 val constraints Constraints.Builder().setRequiresCharging(true).build()val mWorkerRequest4 PeriodicWorkRequestBuilderMyWorker(1, TimeUnit.HOURS).setConstraints(constraints).build()//通过WorkManager提交WorkRequest执行MyWorkerWorkManager.getInstance(this).enqueue(mWorkerRequest4)setRequiresCharging(true)标水充电时执行如果不充电那么这个定时任务就不会执行。不然就会像第一个例子一样定时任务一开始就执行了。 定义执行范围 这是官方在每小时的最后 15 分钟内运行的定期工作的示例 //每小时的最后 15 分钟内运行的定期工作val mWorkerRequest5 PeriodicWorkRequestBuilderMyWorker(1, TimeUnit.HOURS, // 执行周期15, TimeUnit.MINUTES) // 实际执行时间.build()//通过WorkManager提交WorkRequest执行MyWorkerWorkManager.getInstance(this).enqueue(mWorkerRequest5)结合这张图可以更好地理解两个时间 RequiresApi最低为26 失败后的重试 后台任务有失败的可能所以在Worker的doWork方法的返回值中给我们提供了三种方法分别是 Result.success()成功Result.failure()失败Result.retry()重试 成功和失败都是定性的但是重试这个东西应该是会再执行的那么怎么执行呢我们看下面这个例子 首先我们将MyWorker改为下面这个样子 import android.content.Context import android.util.Log import androidx.work.Worker import androidx.work.WorkerParametersclass MyWorker(appContext: Context, workerParams: WorkerParameters):Worker(appContext, workerParams) {companion object{private const val TAG MyWorker}override fun doWork(): Result {Log.d(TAG, doWork: 我正在做一些工作)val doWorkFail trueif (doWorkFail){Log.d(TAG, doWork: 我失败了重试一下)return Result.retry()}return Result.success()}}然后再使用 setBackoffCriteria 方法对回退的工作进行处理 val mWorkerRequest6 OneTimeWorkRequestBuilderMyWorker().setBackoffCriteria(BackoffPolicy.LINEAR,MIN_BACKOFF_MILLIS,TimeUnit.MILLISECONDS).build()//通过WorkManager提交WorkRequest执行MyWorkerWorkManager.getInstance(this).enqueue(mWorkerRequest6 )setBackoffCriteria 有一些参数我们来看下都是什么 BackoffPolicy 指定回退时间策略政策为 LINEAR每次尝试重试时重试间隔都会增加约 10 秒。例如第一次运行以 Result.retry() 结束并在 10 秒后重试然后如果工作在后续尝试后继续返回 Result.retry()那么接下来会在 20 秒、30 秒、40 秒后重试以此类推。如果退避政策设置为 EXPONENTIAL那么重试时长序列将接近 20、40、80 秒以此类推。 backoffDelay timeUnit 具体的时间最小为10s在WorkRequest中有定义 我们跑起来看下效果 结果如下 为WorkRequest打上TAG 我们可以在使用中为WorkRequest打上Tag这样就可以通过WorkManager.cancelAllWorkByTag(String) 取消带有特定标记的所有工作请求或者用WorkManager.getWorkInfosByTag(String) 返回一个 WorkInfo 对象列表该列表可用于确定当前工作状态。 来看下例代码 val mWorkerRequest7 OneTimeWorkRequestBuilderMyWorker().addTag(myWorker).setInitialDelay(12, TimeUnit.MINUTES).build() //通过WorkManager提交WorkRequest执行MyWorkerWorkManager.getInstance(this).enqueue(mWorkerRequest7)Handler().postDelayed({val workInfosByTag WorkManager.getInstance(this).getWorkInfosByTag(myWorker)Log.d(TAG, testWorkManager: ${workInfosByTag.get()})Log.d(TAG, testWorkManager: ${WorkManager.getInstance(this).cancelAllWorkByTag(myWorker).result})WorkManager.getInstance(this).cancelAllWorkByTag(myWorker)WorkManager.getInstance(this).cancelAllWorkByTag(myWorker1).state.observe(this) {Log.d(TAG, testWorkManager: $it)}},10*1000L)通过日志我们可以看到确实可以通过tag找到执行的work但是并不能取消还是执行了 2024-01-18 10:35:26.130 22739-22739 MainActivity com.example.test D testWorkManager: [WorkInfo{mId17366cc4-fa74-4d42-98d9-9b4e845fb19e, mStateCANCELLED, mOutputDataData {}, mTags[myWorker, com.example.test.MyWorker], mProgressData {}}, WorkInfo{mId4c902568-aab9-4a96-b7e5-eccc93eea99c, mStateCANCELLED, mOutputDataData {}, mTags[myWorker, com.example.test.MyWorker], mProgressData {}}, WorkInfo{mId708826dd-8e63-44f2-9311-746b15140bac, mStateCANCELLED, mOutputDataData {}, mTags[myWorker, com.example.test.MyWorker], mProgressData {}}, WorkInfo{mId79e954b7-9318-4d7c-bd67-b8fd0e810479, mStateSUCCEEDED, mOutputDataData {}, mTags[myWorker, com.example.test.MyWorker], mProgressData {}}, WorkInfo{mId7fb339e0-6acc-4b64-b451-ec1c9b82aaa6, mStateCANCELLED, mOutputDataData {}, mTags[myWorker, com.example.test.MyWorker], mProgressData {}}, WorkInfo{mId87938938-1fb9-4304-afd3-bff71716a187, mStateCANCELLED, mOutputDataData {}, mTags[myWorker, com.example.test.MyWorker], mProgressData {}}, WorkInfo{mId9233f46d-0cd4-48d7-9d05-e504bf46d623, mStateENQUEUED, mOutputDataData {}, mTags[myWorker, com.example.test.MyWorker], mProgressData {}}, WorkInfo{mIda55eb79b-b0b0-4e84-8a46-436056c6a8a7, mStateCANCELLED, mOutputDataData {}, mTags[myWorker, com.example.test.MyWorker], mProgressData {}}, WorkInfo{mIda6f46271-e7f7-4f92-87bb-fa2d6e8b8ac2, mStateCANCELLED, mOutputDataData {}, mTags[myWorker, com.example.test.MyWorker], mProgressData {}}, WorkInfo{mIdd831ee89-d58f-4e7d-8994-4d0fc02370ea, mStateCANCELLED, mOutputDataData {}, mTags[myWorker, com.example.test.MyWorker], mProgressData {}}, WorkInfo{mIddd3dca01-d868-465b-8efc-31256b06cc6b, mStateSUCCEEDED, mOutputDataData {}, mTags[myWorker, com.example.test.MyWorker], mProgressData {}}] 2024-01-18 10:35:26.131 22739-22739 MainActivity com.example.test D testWorkManager: androidx.work.impl.utils.futures.SettableFutureac1927[statusPENDING] 2024-01-18 10:35:26.133 22739-22739 MainActivity com.example.test D testWorkManager: IN_PROGRESS 2024-01-18 10:35:26.160 22739-22739 MainActivity com.example.test D testWorkManager: SUCCESS 2024-01-18 10:35:47.721 22739-23012 MyWorker com.example.test D doWork: 我正在做一些工作 2024-01-18 10:35:47.727 22739-22785 WM-WorkerWrapper com.example.test I Worker result SUCCESS for Work [ idb0ba1ea9-8028-45ed-80a9-bb404a6f225c, tags{ com.example.test.MyWorker } ]这是因为已经在队列中等待执行的任务是不会被取消的包括重试回退的任务这里的cancel是周期性任务使用的在下一次worker进入队列时生效 其他取消方法 请注意所有取消方法都是尽力而为的 除了cancelAllWorkByTag还有下面几个取消方法 cancelWorkById 通过id取消 cancelUniqueWork 取消工作链中的工作这个工作链我们后面进阶讲 cancelAllWork 取消所有工作 传参和返回参数 在使用WorkManager中我们有一些场景需要在使用是传参在return中返回参数这时我们就需要使用到setInputData方法接受一个workDataOf方法 示例代码如下 val mWorkerRequest8 OneTimeWorkRequestBuilderMyWorker().addTag(myWorker).setInputData(workDataOf( MY_DATA to 这是我传的参数)).build()//通过WorkManager提交WorkRequest执行MyWorkerWorkManager.getInstance(this).enqueue(mWorkerRequest8)WorkManager.getInstance(this).getWorkInfoByIdLiveData(mWorkerRequest8.id).observe(this) {Log.d(TAG, testWorkManager: ${it.outputData.getString(MY_DATA)})}方法解析 .setInputData(workDataOf( “MY_DATA” to “这是我传的参数”)): 这行代码设置了工作请求的输入数据。输入数据可以用来传递参数给 Worker 任务。这里它设置了一个键为 MY_DATA 的数据值为 这是我传的参数。这意味着在 MyWorker 的 doWork() 方法中可以通过 inputData 获取这个参数。 MyWorker更改为如下 import android.content.Context import android.util.Log import androidx.work.Worker import androidx.work.WorkerParametersclass MyWorker(appContext: Context, workerParams: WorkerParameters):Worker(appContext, workerParams) {companion object{private const val TAG MyWorker}override fun doWork(): Result {val input inputData.getString(MY_DATA) ?: return Result.failure()Log.d(TAG, doWork: 我正在做一些工作 $input)return Result.success(inputData)}}这里的inputData就是setInputData中传过来的然后在success中传递给getWorkInfoByIdLiveData的观察者。 执行结果如下 2024-01-18 11:35:59.761 12706-12772 MyWorker com.example.test D doWork: 我正在做一些工作 这是我传的参数 2024-01-18 11:35:59.762 12706-12706 MainActivity com.example.test D testWorkManager: null 2024-01-18 11:35:59.762 12706-12706 om.example.tes com.example.test I SmartGc CheckAndAddTask : enable 1 periodCheck 1 2024-01-18 11:35:59.781 12706-12750 WM-WorkerWrapper com.example.test I Worker result SUCCESS for Work [ id77bfbabb-4234-4db0-8c74-f6d7aeda1b72, tags{ com.example.test.MyWorker, myWorker } ] 2024-01-18 11:35:59.818 12706-12706 MainActivity com.example.test D testWorkManager: null 2024-01-18 11:35:59.830 12706-12706 MainActivity com.example.test D testWorkManager: 这是我传的参数总结 本文主要介绍了WorkManager的一些基础使用基础基本上学完了后面学进阶一点的未完期待… 参考资料 WorkManager API 使用 WorkManager 调度任务 官方GitHub 代码示例 WorkManager 使用入门
http://www.pierceye.com/news/895473/

相关文章:

  • 西双版纳网站制作公司临沂企业网站建站模板
  • 培训做网站国内适合个人做外贸的网站有哪些
  • 我想卖自己做的鞋子 上哪个网站好中信银行网站怎么做的怎么烂
  • 在线网站建设工程标准godaddy 上传网站
  • 营销型网站方案ppt模板手机建站平台微点
  • 网站信息备案管理系统电商网页精品欣赏网站
  • 推广公司让实名认证怎么办系统优化设置
  • 公司网站 正式上线如何创建一个软件
  • app备案查询网站上海缪斯设计公司地址
  • 旅游小网站怎样做精不做全组建网站 多少钱
  • 天津城乡住房建设厅网站网站建设观点
  • 电子商务网站建设的认识tk网站免费
  • html网页设计网站开发报告企业做的网站费入什么科目
  • 网站建设辶金手指排名十三郑州经济技术开发区教师招聘公告
  • 企业网站建设课程体会西安网站制作定制
  • 网站主题服务公司管理软件免费版
  • 网站建设主要职责六安网站建设
  • wordpress电影站主题一般做兼职在哪个网站
  • 可信网站友链怎么做网站建设行业标准
  • 济南营销网站制作公司哪家好口碑好的家装前十强
  • 公司网站开发费账务处理做图表的网站推荐
  • 网站如何做好用户体验wordpress 文章类
  • 做采集网站的方法世界四大广告公司
  • 做断桥铝窗户的网站宿州推广公司
  • 网站优化制作东莞房价一览表
  • 屏显的企业网站应该怎么做沈阳网站推广优化公司哪家好
  • 外包服务有哪些汕头seo网站建设
  • 新公司网站怎么做推广wordpress 中文 seo 插件
  • 网站建设客户分析国家企业信息公示网(广东)
  • php网站开发技术文档天津市装修公司排名榜