I don't know is there any difference between CoroutineScope(Dispatchers.Main).launch and runOnUiThread, I think both will run on Main thread.
but still confusion is any difference there.?
Thanks.
CodePudding user response:
Firstly, you can call runOnUiThread
only in the context of Activity
.
Secondly, you cannot call suspend functions from runOnUiThread
, while you can do it in CoroutineScope(Dispatchers.Main).launch
block.
Thirdly, runOnUiThread
checks if the current ui thread is busy with other operations, if it is, the task is posted to an activity handler and will be executed when its turn will come.
CodePudding user response:
They're different things using different technologies, and really it comes down to whether you're already using a coroutine or not. If so, just switch to the Main dispatcher when your code needs to be on the main thread. If you're not using coroutines, and you're explicitly using another thread, then you can use runOnUiThread
to run some code on the main one. If you're not using coroutines or threads, then you don't need to call runOnUiThread
at all!
There's nothing stopping you from using runOnUiThread
from inside a coroutine - but it's not really the right tool for the job, you're stepping outside of coroutine handling unnecessarily. Plus like Steyrix says, you need access to something like an Activity
to do it, which could mean holding a reference to one in a long-running coroutine when it should be garbage collected.
There are lots of other ways to get back on the main thread too, e.g. post
ing Runnable
s to a Handler
(or through a View
), or the postValue
methods on LiveData
. You don't have to switch dispatcher if there's something more concise and convenient available, it all depends on the situation