gpt4 book ai didi

android - 切换到 'Main'协程并将其挂起以将结果发送回 'IO'协程

转载 作者:行者123 更新时间:2023-12-02 13:33:40 24 4
gpt4 key购买 nike

当长时间运行的“IO”协程运行时,我需要在某个时间点访问 View 以将其内容绘制到 Canvas 上。我认为在进行任何关于 View 的操作之前,我需要切换到“主要”协程。而且,我还假设我需要等待 View 才能完成其任务。我这样做是这样的:

suspend fun tryBlindFrameBitmap(
frame: View
) = withContext(Dispatchers.IO) {

// offscreen work

createBitmapFromView(frame, calculatedWidth, calculatedHeight)?.let {
// some bitmap exploration
bitmap.recycle()
}

// offscreen work
}

suspend fun createBitmapFromView(
view: View,
width: Int,
height: Int
): Bitmap? {

val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
bitmap.setHasAlpha(true)
val canvas = Canvas(bitmap)

return withContext(Dispatchers.Main) {

suspendCoroutine<Bitmap> { continuation ->

view.post {
view.draw(canvas)
continuation.resume(bitmap)
}
}
}
}

我感觉自己在做错事或超出了“最佳”方式。我还没有测试我的代码,这还可以吗?

如何改善这种情况?

最佳答案

suspendCoroutine<Bitmap>是多余的,withContext(Main)已将您的代码发布到GUI线程。同样,返回类型似乎是不必要的可为空。您可以这样编写函数:

suspend fun createBitmapFromView(view: View, width: Int, height: Int): Bitmap {
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
.apply { setHasAlpha(true) }
withContext(Dispatchers.Main) {
view.draw(Canvas(bitmap))
}
return bitmap
}

关于android - 切换到 'Main'协程并将其挂起以将结果发送回 'IO'协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60069520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com