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
Android 为什么片段中的lifecycleScope.launch会阻止UI线程?_Android_Kotlin_Android Lifecycle_Kotlin Coroutines - Fatal编程技术网

Android 为什么片段中的lifecycleScope.launch会阻止UI线程?

Android 为什么片段中的lifecycleScope.launch会阻止UI线程?,android,kotlin,android-lifecycle,kotlin-coroutines,Android,Kotlin,Android Lifecycle,Kotlin Coroutines,这会阻塞UI线程,但如果我使用GlobalScope,则不会阻塞UI lifecycleScope.launch { activity?.runOnUiThread { Toast.makeText(activity, getString(R.string.txt_savinginprogress), Toast.LENGTH_SHORT).show() } val fileName =

这会阻塞UI线程,但如果我使用GlobalScope,则不会阻塞UI

lifecycleScope.launch {

            activity?.runOnUiThread {
                Toast.makeText(activity, getString(R.string.txt_savinginprogress), Toast.LENGTH_SHORT).show()
            }

            val fileName = "Picture" + System.currentTimeMillis().toString()
            val folderName = "BucketList"

            val bitmap: Bitmap? = photoURI?.let { it1 -> getBitmapFromUri(it1) }

            activity?.let {
                bitmap?.let { it1 ->
                    PhotoSaveHelper(it).savePhoto(fileName, folderName, it1)
                }
            }

            activity?.runOnUiThread {
                Toast.makeText(activity, getString(R.string.txt_saved), Toast.LENGTH_SHORT).show()
            }
        }
    }

lifecycleScope.launch{}
默认情况下在
main
线程上执行内部代码。 尝试使用以下代码在IO dispatcher中启动协同路由(用于长时间运行和密集任务)


lifecycleScope.launch{}
默认情况下在
main
线程上执行内部代码。 尝试使用以下代码在IO dispatcher中启动协同路由(用于长时间运行和密集任务)


Lifecyclescope默认使用主线程调度程序。谢谢,它解决了我的问题:
Lifecyclescope.launch{withContext(Dispatchers.IO){…}
是的,这是正确使用它的方法。而且您根本不需要
runOnUiThread
。只需将这些代码部分保留在
withContext
块之外。Lifecyclescope默认使用主线程调度程序。谢谢,我的问题已经解决了:
Lifecyclescope.launch{withContext(Dispatchers.IO){…}
是的,这是正确使用它的方法。而且您根本不需要
runOnUiThread
。只需将这些代码部分保留在
with context
块之外。这是由内而外的。顶级调度程序应保持原样(
Main
),只有阻塞工作必须进入
withContext(IO)
交换它们会导致性能问题还是违背最佳实践存在一些理论性能问题,就像交给IO线程只是为了立即交回UI线程,但这并不重要。这样做只会让代码更难看,更难理解。OTHH,根据用例不同,如果你有很多IO调用,中间只有一个UI访问,这样可以得到更好的代码。顶级调度程序应保持原样(
Main
),只有阻塞工作必须进入
withContext(IO)
交换它们会导致性能问题还是违背最佳实践存在一些理论性能问题,就像交给IO线程只是为了立即交回UI线程,但这并不重要。这样做只会让代码更难看,更难理解。OTHH,它根据用例而变化,如果你有很多IO调用,并且只有一个UI访问在中间,这样可以得到更好的代码。
lifecycleScope.launch(Dispatchers.IO) {
       withContext(Dispatchers.Main) {
            Toast.makeText(activity, getString(R.string.txt_savinginprogress), Toast.LENGTH_SHORT).show()
       }
}