【发布时间】:2019-12-29 16:09:37
【问题描述】:
我正在使用带有 RxJava2 的 Retrofit 从 Rest API 获取一些数据。我想使用SwipeRefreshLayout 来更新视图,并且我正在使用ViewModel 来处理API 调用,所以我想在其中实现一个方法来以编程方式刷新数据。
我想获得类似https://stackoverflow.com/a/34276564/6787552 的东西,但我不想定期触发,而是想在用户拉动刷新时以编程方式执行此操作。
那是ViewModel:
public class DashboardViewModel extends ViewModel {
public final Single<Dashboard> dashboard;
public DashboardViewModel() {
dashboard = Api.getDashboard();
refresh();
}
public void refresh() {
// Refresh data
}
}
而在DashboardFragment:
@Override
public View onCreateView(...) {
...
viewModel.dashboard
.observeOn(AndroidSchedulers.mainThread())
.subscribe(dashboard -> {
binding.setDashboard(dashboard);
binding.swipeRefreshLayout.setRefreshing(false);
});
binding.swipeRefreshLayout.setOnRefreshListener(() -> viewModel.refresh());
...
}
提前谢谢你!
编辑:
这就是我最终做的:
public class DashboardViewModel extends ViewModel {
private final BehaviorSubject<Dashboard> dashboard;
public DashboardViewModel() {
dashboard = BehaviorSubject.createDefault(Api.getDashboard());
}
public void refresh() {
// I use a Object because null values are not supported
dashboard.onNext(Api.getDashboard());
}
public Observable<Dashboard> getDashboard(){
return dashboard;
}
}
然后在DashboardFragment 订阅viewModel.getDashbaord()
【问题讨论】:
-
打电话给这个,
Api.getDashboard(); -
在哪里?我猜这会创建一个新的
Single,所以我必须在片段中重新订阅。 -
您确定需要单曲吗?如果您每次获得新仪表板时都需要更新 ui,我希望它是可观察的。
-
不,你是对的。我放一个 Single 只是作为一个例子,因为 api 调用返回一个 Single。
-
在您对实现进行编辑之后,我认为您可能会做一些更清洁的事情 - 除非有理由将地图从对象映射到仪表板:
public class DashboardViewModel extends ViewModel { private final BehaviorSubject<Dashboard> dashboard; public DashboardViewModel() { dashboard = BehaviorSubject.createDefault(Api.getDashboard()); } public void refresh() { dashboard.onNext(Api.getDashboard()); } public Observable<Dashboard> getDashboard(){ return dashboard; } }(抱歉,这都是内联的)跨度>
标签: android observable retrofit rx-java2