android - 如何在 Activity 中的 API 调用上从 ViewModel 获取错误?

标签 android mvvm rx-java2 rx-android android-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
}

Activity

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
            }
        }
    })


}

最佳答案

  1. 创建网络响应类:

公共(public)类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);
}

}

  • 创建枚举类:

    公共(public)枚举 ResponseStatus { 加载、成功、错误 }

  • 在 View 模型类中,无论您在何处收到响应,只需发布​​值即可:

    私有(private) MutableLiveData asyncResponseMutableLiveData = new MutableLiveData<>();

    响应成功:

    asyncResponseMutableLiveData.postValue(AsyncResponse.success());

    响应错误:

    asyncResponseMutableLiveData.postValue(AsyncResponse.error(new Throwable(e)));

  • <强>4。在 Activity 类中,观察响应

     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;
    
            }
    

    关于android - 如何在 Activity 中的 API 调用上从 ViewModel 获取错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57985111/

    相关文章:

    android - 如何在 Android 中设置/调用新的输入法

    android - 是否可以每隔 x 分钟自动打开 Android 应用程序?

    wpf - WPF MVVM Prism 中基于ASP.net的基于表单的身份验证

    c# - raisepropertychanged 和 PropertyChanged 有什么区别?

    java - 使用 RxJava 运行代码时出现编译错误

    java - 如何在单个项目的详细信息中而不是在单个 ListView 项目中显示参数

    java - 错误 : cannot access InternalTokenProvider (Firebase/GooglePlayServices)

    c# - 如何查询 Kendo MVVM Treeview 模型

    java - 使用 Retrofit 和 RxJava 组合来自多个 API 调用的数据 (Android)

    java - 发射后取消订阅间隔