使用 RxJava 和 Retrofit 刷新数据
Refresh data with RxJava and Retrofit
我正在使用 Retrofit 和 RxJava2 从 Rest API 中获取一些数据。我想使用 SwipeRefreshLayout
来更新视图,我正在使用 ViewModel
来处理 API 调用,所以我想在其中实现一个方法来以编程方式刷新数据。
我想获得这样的东西 但我不想定期触发,而是想在用户拉动刷新时以编程方式执行此操作。
那就是 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()
我不是 100% 确定我理解你想做什么,但如果我答对了问题,你可以这样做:
- 在模型中放置一个主题(可能是 BehaviorSubject?)
- 将其作为可观察对象公开给
查看并订阅它(而不是订阅单曲)
- 在模型中,当你
从 ui 收到对
refresh()
的新呼叫,做类似的事情
subject.onNext(Api.getDashboard())
这样,每次调用刷新都会导致发出新的仪表板,并且会在视图中正确绑定订阅。
我正在使用 Retrofit 和 RxJava2 从 Rest API 中获取一些数据。我想使用 SwipeRefreshLayout
来更新视图,我正在使用 ViewModel
来处理 API 调用,所以我想在其中实现一个方法来以编程方式刷新数据。
我想获得这样的东西 但我不想定期触发,而是想在用户拉动刷新时以编程方式执行此操作。
那就是 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()
我不是 100% 确定我理解你想做什么,但如果我答对了问题,你可以这样做:
- 在模型中放置一个主题(可能是 BehaviorSubject?)
- 将其作为可观察对象公开给 查看并订阅它(而不是订阅单曲)
- 在模型中,当你
从 ui 收到对
refresh()
的新呼叫,做类似的事情subject.onNext(Api.getDashboard())
这样,每次调用刷新都会导致发出新的仪表板,并且会在视图中正确绑定订阅。