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

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最新上万页的大厂面试真题

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

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

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

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

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

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

oid框架体系架构…**

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

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

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

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

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

上一篇:MySQL分页和排序


下一篇:UE4 绘制Gizmo