Kotlin Coroutines在Android中的使用

时间:2017-11-01 12:50:46

标签: android kotlin

我尝试使用Kotlin Coroutines以获得更好的性能。

但我不确定这是否正确使用它,所以我想让专家进行审核。

用相机拍照后,我猜想屏幕是停电半秒,然后进行图像处理。

原始代码是,

fun uploadPhoto(data: Intent): Observable<Response> {
    val bitmap = data.extras.get("data") as Bitmap
    val bytes = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes)

    val baseDir = Environment.getExternalStorageDirectory()
    val file = File(baseDir, Calendar.getInstance().timeInMillis.toString() + ".jpg")
    val fileOutputStream = FileOutputStream(file)
    fileOutputStream.write(bytes.toByteArray())
    fileOutputStream.close()


    return uploadMedia(file)
}

在我阅读本教程后,https://kotlinlang.org/docs/tutorials/coroutines-basic-jvm.html

我把它改成了,

fun uploadPhoto(data: Intent): Observable<Response> {
    val baseDir = Environment.getExternalStorageDirectory()
    val file = File(baseDir, Calendar.getInstance().timeInMillis.toString() + ".jpg")

    launch {
        val bitmap = data.extras.get("data") as Bitmap
        val bytes = compressBitMap(bitmap).await()
        val fileOutputStream = FileOutputStream(file)
        fileOutputStream.write(bytes.toByteArray())
        fileOutputStream.close()
    }

    return uploadMedia(file)
}

private fun compressBitMap(bitmap: Bitmap) = async(CommonPool) {
    val bytes = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes)
    return@async bytes
}

但我没有看到任何区别。

我想做的事情是,我想在后台运行Compressing Bitmap和fileOutputStream作业以防止打扰MainThread。

它能否带来更好的表现?

1 个答案:

答案 0 :(得分:0)

协同程序在&#34; CoroutineContexts&#34;中执行,您似乎使用较旧版本的库,在较新版本中,您应始终使用启动(UI)或启动(CommonPool)指定上下文。我默认情况下不知道哪种情况是你的&#34;发布&#34;使用,但我猜是UI。 如果这是正确的,那么你在UI线程中等待compressBitMap完成,阻止UI线程(使用无意义的协程)

尝试使用启动(CommonPool),看看魔法是否发生。