【问题标题】:Refactoring an standard Android code into Reactive code将标准 Android 代码重构为响应式代码
【发布时间】:2016-06-20 19:59:48
【问题描述】:

所以,我是一名新手 Android 程序员,正在尝试学习 RxJava/RxAndroid。

我正在开发的应用程序有一个由 API 支持的本地数据库(使用 Cupboard)。它有两个屏幕:一个显示项目列表,另一个显示项目详细信息。每当我需要显示项目时,我都会调用此方法从本地数据库中加载它们,然后:

public void getItems() {
    List<Item> Items = cupboard().withDatabase(database).query(Item.class).list();

    if (Items == null || Items.isEmpty()) {
        service.listItems().enqueue(new Callback<Items>() {
            @Override
            public void onResponse(Call<Items> call, Response<Items> response) {
                if (response.isSuccessful()) {
                    cupboard().withDatabase(database).put(response.body().getItems());
                    mDataReceiver.onItemsLoaded(response.body().getItems());
                } else {
                    Log.d(ItemsLoader.class.getSimpleName(), response.message());
                }
            }

            @Override
            public void onFailure(Call<Items> call, Throwable t) {
                Log.d(ItemsLoader.class.getSimpleName(), t.getMessage());
            }
        });
    } else {
        mDataReceiver.onItemsLoaded(Items);
    }
}

如果没有返回任何内容(空列表或null),我会从 API 加载它们,将其保存在本地数据库中并将其返回给用户。

我试图通过在需要时使用 flatMap 将我的数据库调用与 API 调用链接起来,将这段代码重构为反应式(使用 RxJava、RxAndroid 和 RxCupboard),但我无法让它工作,也无法解决它.

是否可以将此代码重构为 Reactive 或者我应该这样离开?如果可能,这样做的正确方法是什么?

【问题讨论】:

    标签: java android rx-java rx-android


    【解决方案1】:

    这可以通过PublishSubject 解决。当调用onResponse()onFailure() 时,您可以在此对象上发布数据(和错误!)。 PublishSubject 也是一个 Observable,所以你可以订阅它的数据。

    docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 2020-11-12
      • 2014-10-10
      • 1970-01-01
      • 2017-12-06
      相关资源
      最近更新 更多