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()
}
}
}
- 在
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))
}
}
- 实例化
WorkManager
,这里因为我用了Hilt
,所以单独写一个Module
创建WorkManager
@InstallIn(SingletonComponent::class)
@Module
object WorkModule {
@Provides
@Singleton
fun providesWorkManager(@ApplicationContext context: Context): WorkManager =
WorkManager.getInstance(context)
}
Worker 值传入
-
Worker
的继承类是通过Class
传入的,因此为了给Worker
传值可以借助WorkerParameters
,传入可以使用WorkRequest
的setInputData
方法
@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)
}
}
- 接收值使用
WorkerParameters
的mInputData
熟悉
@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 链
- 对于复杂的相关工作,可以使用流畅自然的接口将各个工作任务串联起来,这样便可以控制哪些部分依序运行,哪些部分并行运行。使用用
WorkManager
的beginWith()
或beginUniqueWork()
,这会返回WorkContinuation
实例,WorkContinuation
通过then
添加OneTimeWorkRequest
依赖实例。案例中依次CleanupWorker
、BlurWorker
、SaveImageToFileWorker
// 清空文件夹
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()
}
}
}
- 创建执行链
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)]
只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。
这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。