Kotlin Сопрограммы LiveData - PullRequest
       166

Kotlin Сопрограммы LiveData

0 голосов
/ 07 августа 2020

Приведенный ниже код работает только один раз.

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 голосов
/ 07 августа 2020

Вместо того, чтобы каждый раз создавать 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
        }
    }
}
0 голосов
/ 07 августа 2020

ваши 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())
    }
...