如果在Activity中不使用lifecycleScop创建协程作用域,直接使用CoroutineScope创建会发生什么?

20 阅读1分钟


val testFlow = MutableStateFlow(0)
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test)
        findViewById<ComposeView>(R.id.compose).apply {
            setContent {
                Text(text = "MainActivity", modifier = Modifier.clickable {
                    startActivity(Intent(this@MainActivity, SecondActivity::class.java))
                })
            }
        }


        CoroutineScope(Dispatchers.IO).launch {
            repeat(100000000) {
                testFlow.value = it
                delay(1000)
            }
        }



    }
}
class SecondActivity: ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Text(text = "SecondActivity")
        }
        CoroutineScope(Dispatchers.IO).launch {
            testFlow.collect {
                Log.d("qwer", "collect ${it}")
            }
        }
    }
}

在MainActivity中每隔1秒更改一次testFlow的值,在SecondActivity中获取testFlow的值,实验结果发现当SecondActivity销毁时依然会收到数据并打印出来,并且如果再次打开SecondActivity会重复打印数据

class SecondActivity: ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Text(text = "SecondActivity")
        }
        CoroutineScope(Dispatchers.IO).launch {
            testFlow.collect {
                val root = findViewById<View>(android.R.id.content)
                Log.d("qwer", "collect ${it}")
                Log.d("qwer", "root = ${root}")
            }
        }
    }
}

更进一步,假如协程作用域中持有了Activity的对象,那么jvm就无法对其进行回收,引发内存泄漏