android - 如何在 Activity 中的 API 调用上从 ViewModel 获取错误?
问题描述
当我在 Android 中使用 ViewModel 时,我在 ViewModel 类中使用了两个 MutableLiveData 对象。
var imageList: MutableLiveData<List<HitsItem>> = MutableLiveData()
var errorMessage: MutableLiveData<String> = MutableLiveData()
我想要的是每当设置 API 调用 errorMessage 中发生错误时,同样,当 API 调用成功时,会设置 imageList。
如何在 Activity 中检查 API 是否成功,当 API 调用不成功时,我想在 Activity 中显示 Toast 错误消息..?
ImageViewModel.kt
fun getImages(): LiveData<List<HitsItem>> {
imageList = MutableLiveData()
loadImages()
return imageList
}
fun loadImages() {
val api = PexelClient.getClient().create(ApiInterface::class.java)
val imageObservable = api.images
imageObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map({ result -> result })
.subscribe(
Consumer<ImageModel> { this.handleResults(it) },
Consumer<Throwable> { this.handleError(it) }
)
}
private fun handleResults(list: ImageModel) {
imageList.value = list.hits
errorMessage.value = null
}
private fun handleError(t: Throwable) {
imageList.value = null
errorMessage.value = t.message
}
活动
lateinit var imagesViewModel:ImagesViewModel
lateinit var adapter:ImageAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_mvvm_rx_retrofit)
rv_images.setHasFixedSize(true)
rv_images.layoutManager = LinearLayoutManager(this)
imagesViewModel = ViewModelProviders.of(this).get(ImagesViewModel::class.java)
imagesViewModel.getImages().observe(this, object : Observer<List<HitsItem>> {
override fun onChanged(imageList: List<HitsItem>?) {
if(imageList != null){
adapter = ImageAdapter(this@MvvmRxRetrofit,imageList)
rv_images.adapter = adapter
}
}
})
}
解决方案
- 创建一个网络响应类:
公共类 AsyncResponse {
public ResponseStatus responseStatus ;
public Throwable error ;
public JsonElement data ;
AsyncResponse(ResponseStatus responseStatus, JsonElement data ,Throwable error){
this.responseStatus = responseStatus ;
this.data = data ;
this.error = error ;
}
public static AsyncResponse loading(){
return new AsyncResponse(ResponseStatus.LOADING,null,null);
}
public static AsyncResponse success(JsonElement data){
return new AsyncResponse(ResponseStatus.SUCCESS,data,null);
}
public static AsyncResponse error(Throwable error){
return new AsyncResponse(ResponseStatus.ERROR,null,error);
}
}
创建一个枚举类:
公共枚举响应状态{加载,成功,错误}
在您的视图模型类中,无论您在哪里收到响应,只需发布值:
私有 MutableLiveData asyncResponseMutableLiveData = new MutableLiveData<>();
响应成功:
asyncResponseMutableLiveData.postValue(AsyncResponse.success());
响应错误:
asyncResponseMutableLiveData.postValue(AsyncResponse.error(new Throwable(e)));
4.在Activity Class中,观察响应
mChatDialogViewModel.getResponse().observe(this, new Observer<AsyncResponse>() {
@Override
public void onChanged(@Nullable AsyncResponse asyncResponse) {
if (asyncResponse != null)
consumeResponse(asyncResponse);
}
});
private void consumeResponse(AsyncResponse asyncResponse) {
switch (asyncResponse.responseStatus) {
case LOADING: {
break;
}
case SUCCESS: {
break;
}
case ERROR: {
break;
}
default:
break;
}
推荐阅读
- jquery - 是否可以通过 Promise 防止过多的异步调用?
- sql - 使用带有日期和时间的新创建列在 SQL 中提取数据
- puppeteer - 如何修复网络抓取工具中的“page.goto 不是函数”错误
- git - 如何再次在 Github 中 fork 一个项目?
- javascript - 为什么插入后没有显示文本?
- c# - 如何将此字符串转换为标签?
- pycharm - PyCharm 中再次出现未解决的参考问题
- dynamics-crm - FetchXML 查询返回当前用户下属拥有的所有记录
- database - Solr 关系数据库
- visual-studio - 使用 msbuild.exe 编译项目列表