Kotlin LiveData协程

时间:2020-08-07 09:29:36

标签: android kotlin android-livedata kotlin-coroutines

下面的代码只能运行一次。

class MainActivity : AppCompatActivity() {


    lateinit var userLiveData: LiveData<List<User>>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        getUsers()     //WORKING <---------
        userLiveData.observe(this, Observer {
            it.forEach { user ->
                Log.i("TAG", user.name)
            }
        })

        lifecycleScope.launch {
            delay(5000)  //Refresh the result
            getUsers()   //NOT WORKING <---------
        }
    }

    private fun getUsers() {
        val apiHelper = ApiHelper(RetrofitBuilder.apiService)
        val mainRepository = MainRepository(apiHelper)
        userLiveData = liveData {
            val res = mainRepository.getUsers()  //Suspend function
            emit(res)
        }
    }
}

我第一次调用getUsers()函数时,可以看到日志。但是后来我打电话给getUsers(),屏幕上没有日志。 这意味着userLiveData.observe(函数运行一次。

2 个答案:

答案 0 :(得分:0)

您的LiveData可以引用MutableLiveData,您可以在其中发布内容

private val userMLD = MutableLiveData<List<User>>()
val userLiveData: LiveData<List<User>> = userMLD

    private fun getUsers() {
        val apiHelper = ApiHelper(RetrofitBuilder.apiService)
        val mainRepository = MainRepository(apiHelper)
        userMLD.postValue(mainRepository.getUsers())
    }

答案 1 :(得分:0)

与其每次都创建一个LiveData,不如在协程中运行代码并使用新值更新LiveData。为此,您需要一个MutableLiveData:

class MainActivity : AppCompatActivity() {
    
    private val userLiveData = MutableLiveData<List<User>>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        getUsers()     //WORKING <---------
        userLiveData.observe(this, Observer {
            it.forEach { user ->
                Log.i("TAG", user.name)
            }
        })

        lifecycleScope.launch {
            delay(5000)  //Refresh the result
            getUsers()   //NOT WORKING <---------
        }
    }

    private fun getUsers() {
        val apiHelper = ApiHelper(RetrofitBuilder.apiService)
        val mainRepository = MainRepository(apiHelper)
        lifecycleScope.launch {
            val users = withContext(Dispatchers.IO) {
                mainRepository.getUsers()  //Suspend function
            }
            
            userLiveData.value = users
        }
    }
}