【问题标题】:How do i get error from ViewModel on API Call in Activity?如何在 Activity 中的 API 调用上从 ViewModel 获取错误?
【发布时间】:2020-01-18 23:01:14
【问题描述】:

当我在 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
            }
        }
    })


}

【问题讨论】:

  • make handleResults, handleError in methos in activity 而不是 viewmodel
  • 不过,我如何在 Activity 中同时获得结果、错误和列表
  • 1.不要在getImages() 函数中执行imageList = MutableLiveData()。 2. 使 livedatas 为 val 而不是 var。 3. 在您的活动中也观察errorMessage,就像您观察imageListgetImages() 一样。 4.当你有数据errorMessage.value = null时,不要将null发送到错误。当您遇到错误imageList.value = null 时,不要将 null 发送到数据。删除这些
  • 谢谢,但你能告诉我如何通过示例代码在 Activity 中获取 errorMessage

标签: android mvvm rx-java2 rx-android android-viewmodel


【解决方案1】:
  1. 创建一个网络响应类

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

}

  1. 创建一个枚举类

    公共枚举响应状态{ 加载,成功,错误 }

  2. 在您的 viewmodel 类中,无论您在哪里收到响应,只需发布​​值:

    私有的 MutableLiveData asyncResponseMutableLiveData = 新的 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;

        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多