天天看點

Kotlin實戰指南十五:協程洩漏協程洩漏的本質GlobalScopeMainScopelifecycleScopeviewModelScope

轉載請标明出處: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 , 歡迎關注

Kotlin實戰指南十五:協程洩漏協程洩漏的本質GlobalScopeMainScopelifecycleScopeviewModelScope

繼續閱讀