我不知道CoroutineScope(Dispatchers.Main).launch和runOnUiThread之间有什么区别,我认为两者都将在主线程上运行。但是混淆还是有区别的。
wfsdck301#
首先,只能在Activity的上下文中调用runOnUiThread。其次,您不能从runOnUiThread调用suspend函数,而可以在CoroutineScope(Dispatchers.Main).launch块中调用。第三,runOnUiThread检查当前ui线程是否忙碌其他操作,如果是,则将任务发布到活动处理程序,并在轮到它时执行。
Activity
runOnUiThread
CoroutineScope(Dispatchers.Main).launch
rqdpfwrv2#
使用不同的技术,它们是不同的东西,实际上,这归结为你是否已经使用了协程。如果是这样,当你的代码需要在主线程上时,切换到 Main 调度程序。如果你没有使用协程,而你显式地使用了另一个线程,那么您可以使用runOnUiThread在主线程上运行一些代码。如果您没有使用协程 * 或 * 线程,那么您根本不需要调用runOnUiThread!没有什么可以阻止你在协程中使用runOnUiThread--但是它并不是真正适合这项工作的工具,你不必要地超出了协程处理。另外,就像 Steyrix 所说的,你需要访问类似Activity的东西才能做到这一点,这可能意味着在一个长时间运行的协程中持有一个对它的引用,而它应该被垃圾收集。还有很多其他方法可以回到主线程上,例如post将Runnable转换到Handler(或者通过View),或者LiveData上的postValue方法。如果有更简洁和方便的方法可用,你不必切换调度程序,这完全取决于具体情况
post
Runnable
Handler
View
LiveData
postValue
2条答案
按热度按时间wfsdck301#
首先,只能在
Activity
的上下文中调用runOnUiThread
。其次,您不能从
runOnUiThread
调用suspend函数,而可以在CoroutineScope(Dispatchers.Main).launch
块中调用。第三,
runOnUiThread
检查当前ui线程是否忙碌其他操作,如果是,则将任务发布到活动处理程序,并在轮到它时执行。rqdpfwrv2#
使用不同的技术,它们是不同的东西,实际上,这归结为你是否已经使用了协程。如果是这样,当你的代码需要在主线程上时,切换到 Main 调度程序。如果你没有使用协程,而你显式地使用了另一个线程,那么您可以使用
runOnUiThread
在主线程上运行一些代码。如果您没有使用协程 * 或 * 线程,那么您根本不需要调用runOnUiThread
!没有什么可以阻止你在协程中使用
runOnUiThread
--但是它并不是真正适合这项工作的工具,你不必要地超出了协程处理。另外,就像 Steyrix 所说的,你需要访问类似Activity
的东西才能做到这一点,这可能意味着在一个长时间运行的协程中持有一个对它的引用,而它应该被垃圾收集。还有很多其他方法可以回到主线程上,例如
post
将Runnable
转换到Handler
(或者通过View
),或者LiveData
上的postValue
方法。如果有更简洁和方便的方法可用,你不必切换调度程序,这完全取决于具体情况