CoroutineWorker 压缩图片示例

CoroutineWorker 的主要特点:

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

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

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

Kotlin 复制代码
package com.plcoding.globalsnackbarscompose.worker

import 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.roundToInt

class 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: ByteArray
            var quality = 100
            do {
                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)
Kotlin 复制代码
 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)

    }

作为后台任务

相关推荐
2301_8111305430 分钟前
【保姆级教程】Android Studio完整安装步骤(2026最新版,新手零踩坑)
android·java
帅次32 分钟前
Android 高级工程师面试参考答案:项目经历、自我介绍与实战案例表达
android·面试·职场和发展
小猫爱游戏37 分钟前
theone陪伴ai手机版免费版下载安装教程附带最新邀请码theone陪伴ai设定教程接入下载使用教程手机版安卓版app鸿蒙版苹果版IOS电脑版安装包下载地址
android·人工智能·智能手机·theone陪伴ai·theone陪伴ai下载·免费下载安装·接入微信教程
韩曙亮38 分钟前
【Android】Android 源码查看 ( Android 源码在线查看 2026-03-30 | Android 源码下载 | Android 源码查看工具 )
android·安卓·安卓源码·aosp·android 源码·android源码查看工具·android 源码工具
游戏开发爱好者840 分钟前
iOS应用性能监控:Pre-Main与Main函数耗时分析及Time Profiler使用教程
android·ios·小程序·https·uni-app·iphone·webview
dora1 小时前
从dorachat-auth的角度看登录认证
android
Fate_I_C1 小时前
View Binding的基础使用
android·kotlin·viewbinding
zhangphil2 小时前
Android Coil 3 extend ImageRequest‘s custom method/function,Kotlin
android·kotlin
星河漫步Lu2 小时前
QT6中五步完成Android的环境配置
android·qt