CoroutineWorker 压缩图片示例

ops/2024/10/10 22:42:53/

CoroutineWorker 的主要特点:

  1. Kotlin 协程支持:通过使用 Kotlin 协程,CoroutineWorker 提供了更自然和可读的异步编程模型,避免了复杂的回调嵌套问题。

  2. 后台任务:它允许开发者在后台执行任务,比如数据同步、图片上传、定期执行任务等,而不需要担心任务被中断,即使应用关闭或重启,任务仍会在条件满足时继续执行。

  3. 持久性和约束条件:与普通的后台线程不同,CoroutineWorker 可以设置任务的执行条件,比如仅在设备充电、联网等条件满足时执行。WorkManager 会确保这些条件符合时,任务才会被执行。

package com.plcoding.globalsnackbarscompose.workerimport android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import androidx.work.workDataOf
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.ByteArrayOutputStream
import java.io.File
import kotlin.math.roundToIntclass PhotoCompressionWorker(private val appContex: Context,private val params: WorkerParameters
) : CoroutineWorker(appContex, params) {override suspend fun doWork(): Result {return withContext(Dispatchers.IO) {println("workder doWork")val stringUri = params.inputData.getString(KEY_CONTENT_URI)val compressThresHold = params.inputData.getLong(KEY_COMPRESSION_TH, 0L)val uri = Uri.parse(stringUri)val bytes = appContex.contentResolver.openInputStream(uri)?.use {it.readBytes()} ?: return@withContext Result.failure()val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)var outputBytes: ByteArrayvar quality = 100do {val outputStream = ByteArrayOutputStream()outputStream.use { outputStream ->bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream)outputBytes = outputStream.toByteArray()quality -= (quality * 0.1).roundToInt()}} while (outputBytes.size > compressThresHold && quality > 5)val file = File(appContex.cacheDir,"${params.id}.jpg")file.writeBytes(outputBytes)Result.success(workDataOf(KEY_RESULT_PATH to file.absoluteFile.toString()))}}companion object {const val KEY_CONTENT_URI = "KEY_CONTENT_URI"const val KEY_COMPRESSION_TH = "KEY_COMPRESSION_TH"const val KEY_RESULT_PATH = "KEY_RESULT_PATH"}
}

根据图片,因为不知道图片多大,还一次次的压缩,直到达到压缩的指标大小了,将文件写入文件

怎么启动这个woker呢

workManager = WorkManager.getInstance(applicationContext)

 fun requestWorker(uri: Uri, workManager: WorkManager) {val result = OneTimeWorkRequestBuilder<PhotoCompressionWorker>().setInputData(workDataOf(PhotoCompressionWorker.KEY_CONTENT_URI to uri.toString(),PhotoCompressionWorker.KEY_COMPRESSION_TH to 1024 * 20L)).setConstraints(Constraints(requiresStorageNotLow = true)).build()workManager.enqueue(result)}

作为后台任务


http://www.ppmy.cn/ops/123680.html

相关文章

CentOS 6文件系统

由冯诺依曼在 1945 年提出的计算机五大组成部分&#xff1a;运算器&#xff0c;控制器&#xff0c;存储器&#xff0c;输入设 备&#xff0c;输出设备。 1. 硬盘结构&#xff1a; &#xff08;1&#xff09;机械硬盘结构&#xff1a; 磁盘拆解图&#xff1a; 扇区&#xff0c;…

SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析

文章目录 同步编程&异步编程线程池为什么要使用线程池&#xff1f;Spring自定义线程池SpringBoot轻松调用线程池总结 测试demo链接 同步编程&异步编程 在Java并发编程中&#xff0c;同步和异步是两种常见的处理方式。 同步是指多个任务按顺序执行&#xff0c;一个任务的…

链表Set_LinkList(并集)

并集是把两个集合合并&#xff0c;去除重复元素后组成的集合。 通过键盘输入将两个集合保存在链表A和链表B中&#xff0c;再创建一个链表C用于保存集合A、B的并集&#xff0c;将链表C打印输出。 提示&#xff1a; 1.相对于上一题&#xff08;链表Set_LinkList&#xff08;建立&…

Vue3 ECharts看板

获取 ECharts - 入门篇 - 使用手册 - Apache ECharts npm install echarts <template><div id"main" style"height:400px;"></div> </template><script lang"ts" setup> import { ref, onMounted } from "…

pytest框架之fixture测试夹具详解

前言 大家下午好呀&#xff0c;今天呢来和大家唠唠pytest中的fixtures夹具的详解&#xff0c;废话就不多说了咱们直接进入主题哈。 一、fixture的优势 ​ pytest框架的fixture测试夹具就相当于unittest框架的setup、teardown&#xff0c;但相对之下它的功能更加强大和灵活。 …

计算机网络:物理层 —— 物理层下的传输媒体

文章目录 传输媒体导向性媒体同轴电缆双绞线光纤光纤分类中心波长光纤规格光纤的优缺点 非导向性媒体ISM 频段无线电波微波激光红外线可见光 传输媒体 传输媒体是计算机网络设备之间的物理通路&#xff0c;也称为传输介质或传输媒介&#xff0c;并不包含在计算机网络体系结构中…

hdfs伪分布式集群搭建

1 准备 vmware 虚拟三台centos系统的节点三台机器安装好jdk环境关闭防火墙&#xff08;端口太多&#xff0c;需要的自行去开关端口&#xff09;hadoop压缩包解压至三台服务器 可在一台节点上配置完成后克隆为三台节点 2 host修改 vi /etc/hosts在每个节点上添加三台机器的i…

IPD是什么?IPD开发流程有哪些阶段?

在当今竞争激烈的市场环境中&#xff0c;产品开发的速度和质量成为企业获取竞争优势的关键因素。IPD&#xff08;Integrated Product Development&#xff09;&#xff0c;即集成产品开发&#xff0c;作为一种先进的产品研发管理方法&#xff0c;被广泛认为是提升产品开发效率和…