【问题标题】:Refresh data with RxJava and Retrofit使用 RxJava 和 Retrofit 刷新数据
【发布时间】: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&lt;Dashboard&gt; dashboard; public DashboardViewModel() { dashboard = BehaviorSubject.createDefault(Api.getDashboard()); } public void refresh() { dashboard.onNext(Api.getDashboard()); } public Observable&lt;Dashboard&gt; getDashboard(){ return dashboard; } }(抱歉,这都是内联的)跨度>

标签: android observable retrofit rx-java2


【解决方案1】:

我不能 100% 确定我理解你想要做什么,但如果我的问题是正确的,你可以这样做:

  • 在模型中放置一个主题(可能是一个 BehaviorSubject?)
  • 将其作为可观察对象暴露给 查看并订阅它(而不是订阅单曲)
  • 在模型中,当你 从 ui 接收到refresh() 的新呼叫,执行类似的操作 subject.onNext(Api.getDashboard())

这样,每次调用 refresh 都会产生一个新的仪表板,并且会被视图中的订阅正确绑定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多