我尝试使用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。
它能否带来更好的表现?
答案 0 :(得分:0)
协同程序在&#34; CoroutineContexts&#34;中执行,您似乎使用较旧版本的库,在较新版本中,您应始终使用启动(UI)或启动(CommonPool)指定上下文。我默认情况下不知道哪种情况是你的&#34;发布&#34;使用,但我猜是UI。 如果这是正确的,那么你在UI线程中等待compressBitMap完成,阻止UI线程(使用无意义的协程)
尝试使用启动(CommonPool),看看魔法是否发生。