首页 > 解决方案 > 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;
}

我们是否需要使用异步任务并在其preExecutepostExecute回调中管理 UI?或者是否可以使用 Observable Livedata 对象来做到这一点?

标签: androidandroid-architecture-componentsandroid-livedataandroid-viewmodel

解决方案


你可以这样做。

创建一个具有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 的存储库中实现错误处理的方法。


推荐阅读