转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/106413283
本文出自【赵彦军的博客】
文章目录
- 协程泄漏的本质
- GlobalScope
- MainScope
- lifecycleScope
- viewModelScope
协程泄漏的本质
协程泄漏的本质是协程里的线程泄漏
coroutines 引用
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1"
GlobalScope
class MainActivity : AppCompatActivity() {
var job: Job? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//GlobalScope 全局的
job = GlobalScope.launch(Dispatchers.IO) {
//do some things
}
}
override fun onDestroy() {
super.onDestroy()
//取消协程
job?.cancel()
}
}
MainScope
class MainActivity : AppCompatActivity() {
//MainScope 默认运行在主线程
var scope = MainScope()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//第一个协程
scope.launch(Dispatchers.IO) {
//运行在IO线程
//do some things
}
//第二个协程
scope.launch {
//运行在主线程
//do some things
}
}
override fun onDestroy() {
super.onDestroy()
//取消协程
scope?.cancel()
}
}
lifecycleScope
lifecycleScope 是 KTX 下面的扩展包,Android 帮我们提供了一个扩展
引用
使用
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//第一个协程
lifecycleScope.launch() {
}
//第二个协程
lifecycleScope.launch {
//运行在主线程
//do some things
}
}
override fun onDestroy() {
super.onDestroy()
//取消协程, 这一句页可以不写,Android 内部已经帮我们做了
lifecycleScope.cancel()
}
}
注意:
lifecycleScope
不需要我们手动
cancel()
, 系统已经帮我们做好了
viewModelScope
androidx.lifecycle:lifecycle-viewmodel-ktx
是ViewModel的KTX扩展库,可以让我们在ViewModel中方便的使用Coroutine。
如果想要在 ViewModel 中使用作用域,我们需要添加依稀:
使用:
/**
* @author : zhaoyanjun
* @time : 2021/8/16
* @desc :
*/
class MainViewModel : ViewModel() {
fun getImage(url: String) {
viewModelScope.launch {
//执行协程体
}
}
}
个人微信号:zhaoyanjun125 , 欢迎关注