我是Android Arch组件的新手。我正在尝试使用Android View Model和Live Data制作一个基本的todo应用程序。遵循MVVM模式进行网络调用的最佳方法是什么?我需要在网络请求启动时显示progress bar
,并在调用完成时将其解除,如果出现错误,我需要显示带有相关错误消息的snackbar
。是否可以在不使用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
回调中管理用户界面?或者是否可以使用Observable Livedata对象进行此操作?
答案 0 :(得分:4)
你可以这样做..
创建一个具有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中的存储库中实现错误句柄的。