android - Android MVVM:如何处理网络请求失败?
问题描述
我是 Android Arch 组件的新手。我正在尝试使用 Android 视图模型和实时数据制作一个基本的待办事项应用程序。遵循 MVVM 模式时进行网络调用的最佳方式是什么?我需要progress bar
在网络请求开始时显示 a 并在呼叫完成时将其关闭,如果出现错误,我需要显示 asnackbar
以及相关的错误消息。是否可以在不使用的情况下做到这一点AsyncTask
?
远程存储库类:
public class RemoteRepository {
private APIService apiService;
public RemoteRepository (APIService apiService) {
this.apiService= apiService;
}
public LiveData<List<Project>> getList(String userId) {
final MutableLiveData<List<Project>> data = new MutableLiveData<>();
apiService.getList(userId).enqueue(new Callback<List<Project>>() {
@Override
public void onResponse(Call<List<Project>> call, Response<List<Project>> response) {
data.setValue(response.body());
}
@Override
public void onFailure(Call<List<Project>> call, Throwable t) {
// What to do to show snackbar in activity
}
});
return data;
}
我们是否需要使用异步任务并在其preExecute
和postExecute
回调中管理 UI?或者是否可以使用 Observable Livedata 对象来做到这一点?
解决方案
你可以这样做。
创建一个具有Throwable和期望成功结果对象的类。创建构造函数或 getter setter 方法来设置值。ProjectRepoClass 就是一个例子。
项目回购类::
public class ProjectRepoModel {
private List<Project> mList;
private Throwable mThrowable;
public ProjectRepoModel (List<Project> mList) {
mList= mList;
}
public ProjectRepoModel (Throwable throwable) {
mThrowable = throwable;
}
public List<Project> getList() {
return mList;
}
public Throwable getThrowable() {
return mThrowable;
}
}
根据 API 结果设置值。它可以是错误或成功响应并将其返回。
返回数据:
public LiveData<List<Project>> getList(String userId) {
final MutableLiveData<ProjectRepoModel > data = new MutableLiveData<>();
apiService.getList(userId).enqueue(new Callback<List<Project>>() {
@Override
public void onResponse(Call<List<Project>> call, Response<List<Project>> response) {
data .setValue( new ProjectRepoModel (response.body()));
}
@Override
public void onFailure(Call<List<Project>> call, Throwable t) {
data .setValue( new ProjectRepoModel (t));
}
});
return data;
}
在 UI 部分为实时数据创建 Observable,并根据它检查错误并显示结果。
在 UI 中观察结果如下:
if (mModel.getThrowable() != null)
{
// Show error
} else {
// display success result
}
这就是您如何从 MVVM 的存储库中实现错误处理的方法。
推荐阅读
- gradle - Liferay 模块构建问题
- pandas - 我可以在 Pandas 数据框中使用可以为空的布尔类型吗?
- javascript - 在项目构建之后(通过 Ionic build 命令),当我点击我的 ionic react 项目的 index.html 文件时出现错误
- flutter - 如何防止在 Flutter 的 InheritedWidget 中重新创建小部件?
- python - Pandas 对 Numpy 不同的 dtype 数组进行投射
- java - 从一个类返回到另一个类的方法
- javascript - 文本颜色在 CSS 中悬停时不会改变
- python - Python YellowBrick Rank1d 标签/功能名称截止
- swift - 窗口根更改后的 TabBar 可见性问题
- reactjs - 解析错误:“parserOptions.project”已为@typescript-eslint/parser 设置。该文件与您的项目配置不匹配:jest.config.js