android - 如何在 mvvm android 中处理异常并将该异常传递给我们的 View

标签 android mvvm exception-handling retrofit2 viewmodel

我正在使用 MVVM 架构通过在 android studio 中进行改造来实现 Web 服务。我已经在我的 View 类中处理了服务的响应。但我面临的问题是如何处理异常并将它们传递给我的 View 类。一种方法是在我的 Bean 类中创建构造函数并将响应和错误都传递给它并更新 UI。但我想要更优化的方式来处理 UI 内的异常。

这是我的存储库代码:

final MutableLiveData<MyBeanClass> myBeanClass = new MutableLiveData<>();ApiInterface apiInterface = ApiClient.getClientAuthentication().create(ApiInterface.class);
Call<MyBeanClass> call = apiInterface.getData(id);
call.enqueue(new Callback<MyBeanClass>() {@Override
    public void onResponse(Call<MyBeanClass> call, Response<MyBeanClass> response) {
        if(response.body()!=null) {
            myBeanClass.setValue(response.body());
        }
    }

    @Override
    public void onFailure(Call<MyBeanClass> call, Throwable t) {
     //How to handle exceptions here and pass the exception to UI without making constructor in bean class
    }
});

return myBeanClass;

最佳答案

您可以将 Bean 类包装在 Generic Resource 类中并观察它。谷歌在他们的文档中提到了它:

public class Resource<T> {

    @NonNull public final Status status;
    @Nullable public final T data;
    @Nullable public final String message;

    private Resource(@NonNull Status status, @Nullable T data,
            @Nullable String message) {
        this.status = status;
        this.data = data;
        this.message = message;
    }

    public static <T> Resource<T> success(@NonNull T data) {
        return new Resource<>(Status.SUCCESS, data, null);
    }

    public static <T> Resource<T> error(String msg, @Nullable T data) {
        return new Resource<>(Status.ERROR, data, msg);
    }

    public static <T> Resource<T> loading(@Nullable T data) {
        return new Resource<>(Status.LOADING, data, null);
    }

    public enum Status { SUCCESS, ERROR, LOADING }
}

更多信息可以在这里找到:Google Docs

这样做:

final MutableLiveData<Resource<MyBeanClass>> myBeanClass = new MutableLiveData<>();
ApiInterface apiInterface = 
        ApiClient.getClientAuthentication().create(ApiInterface.class);

Call<Response<MyBeanClass>> call = apiInterface.getData(id);
call.enqueue(new Callback<Resource<MyBeanClass>>() {
    @Override
    public void onResponse(Call<MyBeanClass> call, 
            Response<Resource<MyBeanClass>> response) {
        if (response.body() != null) {
            myBeanClass.setValue(Resource.success(response.body()));
        }
    }

    @Override
    public void onFailure(Call<MyBeanClass> call, Throwable t) {
         myBeanClass.setValue(Resource.error(t.getMessage), null);
    }
});
return myBeanClass;

现在类似地,观察包装在 Resource 中的 ViewModel Bean 类。 根据资源类状态处理成功和错误

关于android - 如何在 mvvm android 中处理异常并将该异常传递给我们的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54568344/

相关文章:

android - 使用 Intent 在 Android 应用程序中共享图像将其作为文本文件而不是照片发送

android - 如何在android中对齐图像

c# - MVVM Light Messenger 接收方法

c# - LiveCharts上的自定义类(class)?

java - 应用程序没有响应

wpf - 如何使用 PRISM 和 Unity 持久化和访问应用程序中所有 View 模型中的登录信息?

java - 如何捕获通过读取和写入文件将引发的所有异常?

mysql - 使用连接池处理事件记录超时的正确方法是什么?

java - JNI - 捕获异常并检查其类型

android - 在Android Studio中获取app:dexDebug错误