将标准Android代码重构为Reactive代码

时间:2016-04-23 12:14:16

标签: java android rx-java rx-android

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

我正在开发研究的应用程序有一个由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加载它们,将其保存在我的本地数据库中并将其返回给用户。

我试图通过使用API​​调用链接我的数据库调用来反应(使用RxJava,RxAndroid和RxCupboard),在需要时使用flatMap,但我无法使其工作,也无法绕过它

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

1 个答案:

答案 0 :(得分:1)

这可以通过PublishSubject来解决。在调用onResponse()onFailure()时,您可以在此对象上发布数据(和错误!)。 PublishSubject也是Observable,因此您可以订阅其数据。

请参阅docs