Ash*_*ora 3 android exception-handling mvvm viewmodel retrofit2
我正在使用 MVVM 架构通过在 android studio 中进行改造来访问 Web 服务。我已经在我的视图类中处理了服务的响应。但我面临的问题是如何处理异常并将它们传递给我的视图类。一种方法是在我的 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;
Run Code Online (Sandbox Code Playgroud)
小智 8
您可以将 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 }
}
Run Code Online (Sandbox Code Playgroud)
可以在此处找到更多信息: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;
Run Code Online (Sandbox Code Playgroud)
现在类似地,在你的 ViewModel Bean 类中观察 Resource 中的情况。根据资源类Status处理成功和错误
| 归档时间: |
|
| 查看次数: |
2744 次 |
| 最近记录: |