简体   繁体   中英

I am confused with how lifecycleScope in android studio works

I am confused about how flow.collect works. Because in the lifecycleScope below I already say that a should be assigned by the value of data in my database. However, the value of a is still the string of "Hi" instead of "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)

}
}

this is all of the information in my database

在此处输入图像描述

lifecycleScope.launch will start a coroutine, to make it simple the code inside lifecycleScope.launch will be executed in another thread and it will take some time until inserting data and reading it from database, but println(a) is on the main thread so it will be executed before this line a = it[it.size - 1].name , so your println(a) should be inside lifecycleScope.launch like this:

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)
            }
        }
    }
}

Note: take a look on kotlin coroutines to better understand

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM