【发布时间】:2020-03-06 12:33:42
【问题描述】:
一切正常的 API 请求都返回响应,但是,活动观察者仅在第一次触发时使用空值,并且当响应来自请求观察者时没有看到更改。
活动:
viewModel.jobQuestions.observe(this, Observer { list ->
list?.let {
jobQuestionsRv.apply {
setAdapterData(list)
}
}
})
视图模型:
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
}
【问题讨论】:
-
enqueue是异步函数,这意味着你在调用onResponse之前返回空的questionsList。您可以在getQuestions中使用和返回LivaData,在onResponse中使用setValue/postValue这个livedata的方法 -
是的,我试过了,它的工作,但我认为这是在 viewModel 中生成实时数据的更好解决方案,我能以某种方式实现吗?
-
那么你必须在
getQuestions中传递回调,这些回调将在onResponse和onFailure中调用 -
我怎样才能做到这一点?
-
你的网络请求函数是什么类型的?
标签: android kotlin mvvm android-livedata