GlobalScope.launch的协程作用域不受限制, 即除非主进程退出, 否则只要该协程不结束就会占用资源;
这导致了如果协程的执行体中出现异常协程仍会占用资源而非释放. 最差的情况下有可能反复调用导致设备资源被占满宕机.
综上, 使用GlobalScope.launch有可能导致无法预料的内存泄漏.
因此, 在任何情况下, 我们都应限制线程的作用域"CoroutineScope";
在使用suspend修饰的方法中, 可以使用"coroutineScope"
在没有suspend修饰的方法中, 可以使用"runBlocking"
suspend fun myFunc() = coroutineScope{ // 同步代码... launch { // 异步代码... } // 同步代码... } fun main() { // 同步代码... // runBlocking将挂起当前线程(即main)直到runBlocking内执行体结束 runBlocking { myFunc() // 此时该方法相对于main线程来说, 是同步的 // 如果需要异步也可使用launch launch { // 异步代码... } // 同步代码... } // 同步代码... }
coroutineScope