Kotlin實戰指南十五:協程泄漏

轉載請標明出處:https://blog.csdn.net/zhaoyanjun6/article/details/106413283
本文出自【趙彥軍的博客】


協程泄漏的本質

協程泄漏的本質是協程裏的線程泄漏

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 幫我們提供了一個擴展

引用

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() , 系統已經幫我們做好了


個人微信號:zhaoyanjun125 , 歡迎關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章