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