notes on Kotlin Coroutine
- think Coroutine as Callbacks hook rather than thread
- runBlocking on main (UI) thread will permanently block UI, and never wake up again
- runBlocking block the current thread until all inner code is done
- runBlocking confines execution to a single thread, which make inner code run sequentially, use launch or make function withContext with Dispatcher.IO or Dispatcher.Default to start a new thread to achieve concurrency
- use of GlobalScope.launch create global coroutine, which makes the coroutine lose its coroutine context (i.e. it no longer belongs to activity but application) (reference from https://elizarov.medium.com/the-reason-to-avoid-globalscope-835337445abc), use CoroutineScope(Dispatchers.Main).launch or MainScrope().lanuch instead
- Dispatcher.Main will add the code to the last of the event queue (i.e. run at last), use Dispatcher.Main.immediate
- to be continued..