ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Jetpack系列(九) — WorkManager,为什么说spring让Android变得更好

2022-02-03 17:58:29  阅读:196  来源: 互联网

标签:val spring WorkManager ctx Worker params Result Jetpack fun


params: WorkerParameters
) : Worker(ctx, params) {

override fun doWork(): Result {
// 通知,记得加通道
makeStatusNotification(“Blurring image”, ctx)
return try {
val picture = BitmapFactory.decodeResource(
ctx.resources,
R.drawable.test
)
val output = blurBitmap(picture, ctx) // 模糊
val outputUri = writeBitmapToFile(ctx, output) // 保存图片
makeStatusNotification(“Output is $outputUri”, ctx)
Result.success()
} catch (throwable: Throwable) {
Result.failure()
}
}
}

  1. ViewModel当中通过WorkManager触发Worker,``WorkRequest`有三个子类,前两个
  • PeriodicWorkRequest 周期性执行多次,直至取消
  • OneTimeWorkRequest 仅仅执行一次
  • WorkRequestHolder 包含WorkRequest信息,不用于任务执行

@HiltViewModel
class MainViewModel @Inject constructor(
private val repository: WordRepository,
private val workManager: WorkManager
) : ViewModel() {

fun applyBlur() {
workManager.enqueue(OneTimeWorkRequest.from(BlurWorker::class.java))
}
}

  1. 实例化WorkManager,这里因为我用了Hilt,所以单独写一个Module创建WorkManager

@InstallIn(SingletonComponent::class)
@Module
object WorkModule {

@Provides
@Singleton
fun providesWorkManager(@ApplicationContext context: Context): WorkManager =
WorkManager.getInstance(context)
}

Worker 值传入

  1. Worker的继承类是通过Class 传入的,因此为了给Worker 传值可以借助WorkerParameters,传入可以使用WorkRequestsetInputData方法

@HiltViewModel
class MainViewModel @Inject constructor(
private val repository: WordRepository,
private val workManager: WorkManager
) : ViewModel() {

private var _imageUri = MutableLiveData()

val imageUri: LiveData<Uri?>
get() = _imageUri

fun applyBlur() {
val workRequest = OneTimeWorkRequestBuilder()
.setInputData(createInputDataForUri())
.build()
workManager.enqueue(workRequest)
}

private fun createInputDataForUri(): Data {
val builder = Data.Builder()
imageUri.let {
builder.putString(KEY_IMAGE_URI, imageUri.value.toString())
}
return builder.build()
}

fun setImageUri(uri: Uri) {
_imageUri.postValue(uri)
}

}

  1. 接收值使用WorkerParametersmInputData熟悉

@HiltWorker
class BlurWorker @AssistedInject constructor(
@Assisted private val ctx: Context,
@Assisted params: WorkerParameters
) : Worker(ctx, params) {

override fun doWork(): Result {
val resourceUri = inputData.getString(KEY_IMAGE_URI)
makeStatusNotification(“Blurring image”, ctx)
return try {
val picture = BitmapFactory.decodeStream(
ctx.contentResolver.openInputStream(Uri.parse(resourceUri)))
val output = blurBitmap(picture, ctx)
val outputUri = writeBitmapToFile(ctx, output)
makeStatusNotification(“Output is $outputUri”, ctx)
Result.success()
} catch (throwable: Throwable) {
Result.failure()
}
}
}

Work 链

  1. 对于复杂的相关工作,可以使用流畅自然的接口将各个工作任务串联起来,这样便可以控制哪些部分依序运行,哪些部分并行运行。使用用 WorkManagerbeginWith()beginUniqueWork(),这会返回 WorkContinuation 实例, WorkContinuation 通过then添加 OneTimeWorkRequest 依赖实例。案例中依次CleanupWorkerBlurWorkerSaveImageToFileWorker

// 清空文件夹
class CleanupWorker(
ctx: Context,
params: WorkerParameters
) : Worker(ctx, params) {

override fun doWork(): Result {
makeStatusNotification(“Cleaning up old temporary files”, applicationContext)

return try {
val outputDirectory = File(applicationContext.filesDir, OUTPUT_PATH)
if (outputDirectory.exists()) {
val entries = outputDirectory.listFiles()
if (entries != null) {
for (entry in entries) {
val name = entry.name
if (name.isNotEmpty() && name.endsWith(".png")) {
val deleted = entry.delete()
}
}
}
}
Result.success()
} catch (exception: Exception) {
Result.failure()
}
}
}

// 模糊图片
class BlurWorker(
ctx: Context,
params: WorkerParameters
) : Worker(ctx, params) {

override fun doWork(): Result {
val appContext = applicationContext
val resourceUri = inputData.getString(KEY_IMAGE_URI)
makeStatusNotification(“Blurring image”, appContext)

return try {
if (TextUtils.isEmpty(resourceUri)) {
throw IllegalArgumentException(“Invalid input uri”)
}
val resolver = appContext.contentResolver
val picture = BitmapFactory.decodeStream(
resolver.openInputStream(Uri.parse(resourceUri)))
val output = blurBitmap(picture, appContext)
val outputUri = writeBitmapToFile(appContext, output)

val outputData = workDataOf(KEY_IMAGE_URI to outputUri.toString())
Result.success(outputData)
} catch (throwable: Throwable) {
Result.failure()
}
}
}

// 存入图库(别忘了加动态权限)
class SaveImageToFileWorker(
ctx: Context,
params: WorkerParameters
) : Worker(ctx, params) {

private val Title = “Blurred Image”
private val dateFormatter = SimpleDateFormat(
“yyyy.MM.dd ‘at’ HH:mm:ss z”,
Locale.getDefault()
)

override fun doWork(): Result {

makeStatusNotification(“Saving image”, applicationContext)

val resolver = applicationContext.contentResolver
return try {
val resourceUri = inputData.getString(KEY_IMAGE_URI)
val bitmap = BitmapFactory.decodeStream(
resolver.openInputStream(Uri.parse(resourceUri))
)
val imageUrl = MediaStore.Images.Media.insertImage(
resolver, bitmap, Title, dateFormatter.format(Date())
)
if (!imageUrl.isNullOrEmpty()) {
val output = workDataOf(KEY_IMAGE_URI to imageUrl)

Result.success(output)
} else {
Result.failure()
}
} catch (exception: Exception) {
Result.failure()
}
}
}

  1. 创建执行链

fun applyBlur() {
var continuation = workManager
.beginUniqueWork(
IMAGE_MANIPULATION_WORK_NAME,
ExistingWorkPolicy.REPLACE,
OneTimeWorkRequest
.from(CleanupWorker::class.java)
)

// 反复模糊,这几我就循环三次
for (i in 0 until 3) {
val blurBuilder = OneTimeWorkRequestBuilder()
if (i == 0) {
blurBuilder.setInputData(createInputDataForUri())
}
continuation = continuation.then(blurBuilder.build())
}

val save = OneTimeWorkRequestBuilder()

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

oid框架体系架构…**

[外链图片转存中…(img-kUum8mMA-1643882132176)]

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

标签:val,spring,WorkManager,ctx,Worker,params,Result,Jetpack,fun
来源: https://blog.csdn.net/wq221aas/article/details/122777430

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有