当 Retrofit 请求失败或成功时,如何在 Repository 和 ViewModel 类之间进行通信?

Mud*_*ddz 8 android mvvm android-livedata android-viewmodel

多年来,我一直在开发与MVP模式Android应用程序,但现在我正在努力学习MVVMViewModelLiveData

在下面的示例中,我不知道如何根据POSTGET请求传达失败或成功的结果Retrofit

与MVP之前,我将与使用侦听器与任何沟通主持人listener.onTodoFetched()listener.onTodoFetchError()反应,然后根据不同的哪个方法被调用。我还应该以这种方式与ViewModel班级交流吗?

获取TodoRepository.java

public MutableLiveData<String> fetchTodo() {
    retrofitService.getRetrofitService().create(Endpoints.class).getTodo().enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {

            if (response.isSuccessful() && response.body() != null) {
                listener.onTodoFetched(response.body());     //ViewModel equivalent?
            } else {
                listener.onTodoFetchError(response.message());     //ViewModel equivalent?
            }

        }

        @Override
        public void onFailure(Call<String> call, Throwable t) {
            listener.onTodoFetchError(t.getMessage());     //ViewModel equivalent?
        }
    });

    return mutableLiveData;
}
Run Code Online (Sandbox Code Playgroud)

更新:

根据答案和进一步研究,可以使用以下方法:

  • 类之间的普通 Java 侦听器
  • RxJava
  • Kotlin 高阶函数。

har*_*esh 2

当您将 mvvm 与 livedata 一起使用时,您实际上不需要使用接口将数据传递给 viewmodel。

MutableLiveData 有方法 setValue() 传递您的响应,然后当您在 viewmodel 中调用此 fetchTodo() 方法时,您将获得所有数据。

尝试下面的代码

  public MutableLiveData<String> fetchTodo() {
retrofitService.getRetrofitService().create(Endpoints.class).getTodo().enqueue(new 
Callback<String>() {
    @Override
    public void onResponse(Call<String> call, Response<String> response) {

        if (response.isSuccessful() && response.body() != null) {
            mutableLiveData.setValue(response.body())
        } else {
             mutableLiveData.setValue(response.message());    
        }

    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {
         mutableLiveData.setValue(t.message());    //ViewModel equivalent?
    }
});

return mutableLiveData;
}
Run Code Online (Sandbox Code Playgroud)

在你的视图模型中:

 public LiveData<String> fetchTodo()
{
 return yourRepoInstance.fetchTodo() ; here you will get result data
}
Run Code Online (Sandbox Code Playgroud)