Closed ppg408331701 closed 4 years ago
titleData只是举个例子,这个需求就是某个列表页的数据会缓存一段时间,我希望能判断缓存是否过期,不过期直接返回上一次的数据,否则请求网络
可以看下文档,框架提供了2种请求方式 ,1种是直接回调在activity/fragment,就是你刚刚说的那种,还有1种是在当前viewmodel直接拿到结果做你想要的操作 示例:
class xxxViewModel : BaseViewModel() {
fun login(username: String, password: String){
request({HttpRequestManger.instance.login(username,password)},{
//请求成功 已自动处理了 请求结果是否正常
it.username.logd()
},{
//请求失败 网络异常,或者请求结果码错误都会回调在这里
it.errorMsg.logd()
},true,"正在登录中...")
}
我有点希望实现的是这个效果
var titleData: MutableLiveData<ResultState<ArrayList<ClassifyResponse>>> = MutableLiveData()
fun getProjectTitleData() {
if (titleData.data.size>0){
titleData.value = ResultState.onAppSuccess(titleData.value);
}else{
request({ HttpRequestManger.apiService.getProjecTitle() }, titleData)
}
}
可以看下文档,框架提供了2种请求方式 ,1种是直接回调在activity/fragment,就是你刚刚说的那种,还有1种是在当前viewmodel直接拿到结果做你想要的操作 示例:
class xxxViewModel : BaseViewModel() {
fun login(username: String, password: String){
request({HttpRequestManger.instance.login(username,password)},{
//请求成功 已自动处理了 请求结果是否正常
it.username.logd()
},{
//请求失败 网络异常,或者请求结果码错误都会回调在这里
it.errorMsg.logd()
},true,"正在登录中...")
}
ok。我再研究一下。谢谢啦
fun getProjectTitleData() {
when (titleData.value) {
is ResultState.Success -> {
LogUtils.e("Success")
titleData.value = titleData.value;
}
else -> {
LogUtils.e("un--Success")
request({ HttpRequestManger.apiService.getProjecTitle() }, titleData)
}
}
}
我研究出来了,我目前这是这样做,如果之前titleData成功请求过一次,就一直用第一次的数据,
这样场景主要是弹出来类的列表dialog,比如弹出收货地址之类的
比如我在viewmodel中定义了titleData,我会多次调用getProjectTitleData这个接口
var titleData: MutableLiveData<ResultState<ArrayList<ClassifyResponse>>> = MutableLiveData()
此时在getProjectTitleData()中我想先判断拿到 titleData中的ArrayList做一些操作,再决定是否继续调用网络请求。
但是目前被ResultState包装对象后,就拿不到resultState.data这个字段了。这个ResultState应该怎么写才能暴露出类似getData()这样的方法?
我看谷歌的文档 https://developer.android.google.cn/jetpack/docs/guide#addendum 似乎也是这样,感觉很不方便啊