2016-04-23 6 views
1

Also, ich bin ein Anfänger Android-Programmierer versuchen, RxJava/RxAndroid zu lernen.Refactoring ein Standard-Android-Code in Reactive-Code

Die App, die ich entwickle, um zu studieren, hat eine lokale Datenbank (mit Schrank), die von einer API unterstützt wird. Es hat zwei Bildschirme: Einer zeigt eine Liste von Elementen und andere die Details der Elemente. Jedes Mal, wenn ich brauche, um die Elemente zu zeigen, dass ich diese Methode aufrufen, um sie von meiner lokalen Datenbank zu laden und:

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); 
    } 
} 

Wenn nichts (leere Liste oder null) zurückgeführt wird, ich sie von der API laden, speichern Sie es in meinem lokalen Datenbank und gibt es an den Benutzer zurück.

Ich habe versucht, diesen Code in reaktive umzuformen (mit RxJava, RxAndroid und RxCupboard) durch Verkettung meiner Datenbankaufrufe mit dem API-Aufruf, wenn nötig, mit FlatMap, aber ich konnte es einfach nicht funktionieren noch wickeln meinen Kopf herum es.

Ist es möglich, diesen Code in Reactive umzuwandeln oder sollte ich diesen Weg verlassen? Wenn möglich, was wäre der richtige Weg?

Antwort

1

Dies kann mit einem PublishSubject gelöst werden. Sie können Daten (und Fehler!) Für dieses Objekt veröffentlichen, wenn onResponse() oder onFailure() aufgerufen wird. PublishSubject ist auch ein Observable, so dass Sie seine Daten abonnieren können.

Siehe docs.