簡體   English   中英

我對 android studio 中的生命周期范圍的工作方式感到困惑

[英]I am confused with how lifecycleScope in android studio works

我對 flow.collect 的工作方式感到困惑。 因為在下面的生命周期范圍中,我已經說過 a 應該由我的數據庫中的數據值分配。 但是,a 的值仍然是字符串“Hi”而不是“Hello”。

class MainActivity : AppCompatActivity() {
    private var binding: ActivityMainBinding? = null
    private var a: String = "Hi"

override fun onCreate(savedInstanceState: Bundle?) {
    binding = ActivityMainBinding.inflate(layoutInflater)
    super.onCreate(savedInstanceState)
    setContentView(binding?.root)

    val somethingDao = SomethingDatabase.getDatabase(this).somethingDao()

    lifecycleScope.launch {
        somethingDao.insert(SomethingModel("Hello"))
        somethingDao.fetchAllSomething().collect {
            a = it[it.size - 1].name
        }
    }

    println(a)

}
}

這是我數據庫中的所有信息

在此處輸入圖像描述

LifecycleScope.launch 將啟動一個協程,為簡單起見,lifecycleScope.launch 中的代碼將在另一個線程中執行,插入數據並從數據庫中讀取數據需要一些時間,但println(a)在主線程上,所以它將在此行之前執行a = it[it.size - 1].name ,因此您的println(a)應該像這樣在生命周期范圍內:

class MainActivity : AppCompatActivity() {
    private var binding: ActivityMainBinding? = null
    private var a: String = "Hi"

    override fun onCreate(savedInstanceState: Bundle?) {
        binding = ActivityMainBinding.inflate(layoutInflater)
        super.onCreate(savedInstanceState)
        setContentView(binding?.root)

        val somethingDao = SomethingDatabase.getDatabase(this).somethingDao()

        lifecycleScope.launch {
            somethingDao.insert(SomethingModel("Hello"))
            somethingDao.fetchAllSomething().collect {
                a = it[it.size - 1].name
                println(a)
            }
        }
    }
}

注意:查看 kotlin 協程以更好地理解

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM