文章目錄
- 協程洩漏的本質
- GlobalScope
- MainScope
- lifecycleScope
- viewModelScope
協程洩漏的本質是協程裡的線程洩漏
coroutines 引用
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1"
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()
}
}
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 是 KTX 下面的擴充包,Android 幫我們提供了一個擴充
引用
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
使用
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()
, 系統已經幫我們做好了
androidx.lifecycle:lifecycle-viewmodel-ktx
是ViewModel的KTX擴充庫,可以讓我們在ViewModel中友善的使用Coroutine。
如果想要在 ViewModel 中使用作用域,我們需要添加依稀:
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
/**
* @author : zhaoyanjun
* @time : 2021/8/16
* @desc :
*/
class MainViewModel : ViewModel() {
fun getImage(url: String) {
viewModelScope.launch {
//執行協程體
}
}
}