2016-04-23 45 views
1

因此,我是一位试图学习RxJava/RxAndroid的新手Android程序员。将一个标准Android代码重构为Reactive代码

我正在开发的应用程序有一个本地数据库(使用橱柜),由API支持。它有两个屏幕:一个显示项目列表和其他项目细节。每当我需要显示的项目我把这个方法从我的本地数据库加载它们和:

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

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

请参阅docs