【发布时间】:2020-01-20 22:24:19
【问题描述】:
多年来,我一直在使用 MVP 模式开发 Android 应用程序,但我现在正在尝试学习 MVVM 与 ViewModel 和 LiveData
在以下示例中,我不知道如何通过 Retrofit 发送 POST 或 GET 请求来传达失败或成功结果
在使用 MVP 之前,我会使用 Listener 与 listener.onTodoFetched() 或 listener.onTodoFetchError() 通信演示者,然后根据调用的方法做出不同的反应。我还应该以这种方式与我的ViewModel 班级交流吗?
FetchTodoRepository.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;
}
更新:
根据答案和进一步的研究,可以使用以下方法:
- 类之间的普通 Java 侦听器
- RxJava
- Kotlin 高阶函数。
【问题讨论】:
-
如果你使用 RX 会更容易,twith RX 你可以在成功/失败时观察响应和发布值。但是对于侦听器,我会在 VM 中创建 LiveData 变量(例如,1 用于成功(字符串),2 用于错误(枚举)。然后在您的侦听器上,您可以使用方法
postValue()在您的变量上发布数据。之后是否要使用 DataBinding 或观察片段/活动中的 LiveData 以进行更改取决于您。 -
所以在
MVVM中使用RxJava或普通Java 侦听器在Repository和ViewModel之间进行通信不会错吗? -
普通的监听器很好,因为你还在使用 Java,RxJava 将是一个不错的选择,但是,我还想提一下,如果你打算使用 Kotlin 或协程,Retrofit默认支持挂起函数,更容易与 MVVM 架构和 LiveData 结合。
-
@RodrigoQueiroz 所以我的方法
fetchTodo()实际上不必返回MutableLiveData的对象,如果我使用 Listener 或 RxJava 将结果返回到ViewModel
标签: android mvvm android-livedata android-viewmodel