Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin协同路由在Android中的使用_Android_Kotlin - Fatal编程技术网

Kotlin协同路由在Android中的使用

Kotlin协同路由在Android中的使用,android,kotlin,Android,Kotlin,我正在尝试使用Kotlin协程以获得更好的性能 但我不确定这是不是正确的使用方法,所以我想请专家们进行评审 在用相机拍照后,屏幕会被遮住半秒钟,而我猜图像处理是这样的 原来的代码是, fun uploadPhoto(data: Intent): Observable<Response> { val bitmap = data.extras.get("data") as Bitmap val bytes = ByteArrayOutputStream() bit

我正在尝试使用Kotlin协程以获得更好的性能

但我不确定这是不是正确的使用方法,所以我想请专家们进行评审

在用相机拍照后,屏幕会被遮住半秒钟,而我猜图像处理是这样的

原来的代码是,

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)
}
fun上传照片(数据:意图):可观察{
val bitmap=data.extras.get(“数据”)作为位图
val bytes=ByteArrayOutputStream()
bitmap.compress(bitmap.CompressFormat.JPEG,100,字节)
val baseDir=Environment.getExternalStorageDirectory()
val file=file(baseDir,Calendar.getInstance().timeInMillis.toString()+“.jpg”)
val fileOutputStream=fileOutputStream(文件)
fileOutputStream.write(bytes.toByteArray())
fileOutputStream.close()
返回上传的媒体(文件)
}
在我读了这个教程之后

我把它改成

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
}
fun上传照片(数据:意图):可观察{
val baseDir=Environment.getExternalStorageDirectory()
val file=file(baseDir,Calendar.getInstance().timeInMillis.toString()+“.jpg”)
发射{
val bitmap=data.extras.get(“数据”)作为位图
val bytes=压缩位图(位图).await()
val fileOutputStream=fileOutputStream(文件)
fileOutputStream.write(bytes.toByteArray())
fileOutputStream.close()
}
返回上传的媒体(文件)
}
私有fun压缩位图(位图:位图)=异步(公共池){
val bytes=ByteArrayOutputStream()
bitmap.compress(bitmap.CompressFormat.JPEG,100,字节)
return@async字节
}
但我看不出有什么不同

我想做的是,我想在后台运行压缩位图和fileOutputStream作业,以防止干扰主线程


它是否提高了性能?

协同程序在“协同程序文本”中执行,您似乎正在使用旧版本的libs,在新版本中,您应该始终使用启动(UI)或启动(CommonPool)指定上下文。我不知道默认情况下“启动”使用的是哪个上下文,但我猜是UI。 如果这是正确的,您实际上是在UI线程中等待compressBitMap完成,阻塞UI线程(一种无意义的协同程序使用)


尝试改用launch(CommonPool),看看是否发生了奇迹。

似乎
fun compressBitMap
应该改为
suspend fun compressBitMap