Наблюдатель LiveData запускается только один раз с пустым значением - PullRequest
0 голосов
/ 06 марта 2020

Все, что работает API, возвращают ответ на запрос, но наблюдатель активности запускается только первый раз с пустым значением, а когда ответ приходит от запроса, наблюдатель не видит изменений.

Активность:

viewModel.jobQuestions.observe(this, Observer { list ->
            list?.let {
                jobQuestionsRv.apply {
                  setAdapterData(list)
                }
            }
        })

ViewModel:

class JobQuestionsViewModel @Inject constructor(private val repository: Repository) : ViewModel() {

private val _jobQuestions = MutableLiveData<List<QuestionModel>>()
val jobQuestions: LiveData<List<QuestionModel>> = _jobQuestions

init {
    _jobQuestions.postValue(repository.getQuestions())
    }
}

Репозиторий:

override fun getQuestions(): List<QuestionModel> {

    var questionsList = ArrayList<QuestionModel>()

    apiRequests?.questions()?.enqueue(object : retrofit2.Callback<List<QuestionModel>> {
        override fun onResponse(
            call: Call<List<QuestionModel>>?,
            response: Response<List<QuestionModel>>
        ) {
            response.body()?.let {
                questionsList.addAll(response.body())

            }
        }

        override fun onFailure(call: Call<List<QuestionModel>>?, t: Throwable?) {
            questionsList.clear()

        }
    })

    return questionsList
}

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Если вы хотите вернуть LiveData из своего репозитория, вы можете сделать следующее:

В репозитории изменить тип questionsList на MutableLiveData и опубликовать значение всякий раз, когда оно возвращается из обратного вызова:

override fun getQuestions(): LiveData<QuestionModel> {

    val questionsList = MutableLiveData<List<QuestionModel>>()

    apiRequests?.questions()?.enqueue(object : retrofit2.Callback<List<QuestionModel>> {
        override fun onResponse(
            call: Call<List<QuestionModel>>?,
            response: Response<List<QuestionModel>>
        ) {
            response.body()?.let {
                questionsList.postValue(response.body())

            }
        }

        override fun onFailure(call: Call<List<QuestionModel>>?, t: Throwable?) {
            questionsList.postValue(emptyList())

        }
    })

    return questionsList
}

В ViewModel просто вызовите getQuestions ():

class JobQuestionsViewModel @Inject constructor(private val repository: Repository) : ViewModel() {

    val jobQuestions: LiveData<List<QuestionModel>> = repository.getQuestions()
}
0 голосов
/ 06 марта 2020

Если данные, которые вы получаете в качестве наблюдателя, выдают какое-либо исключение, то этот наблюдатель больше не будет вызываться, пока вы снова не установите этого наблюдателя или не предотвратите исключение.

...