使用 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())

这样,每次调用刷新都会导致发出新的仪表板,并且会在视图中正确绑定订阅。