2016-09-29 8 views
0

Ich habe 3 Ebenen in meiner App. Layer1 abonniert Observable von Layer2. Layer2 abonniert Layer3, um zurückgegebene Daten an Layer1 zu senden.RxJava Observables in Ebenen verbinden

Layer1

layer2.getData(data).subscribe(newData -> {Log.d("onNext", "returned");}, 
        throwable -> {Log.d("onError", throwable.getMessage());}); 

Angenommen Layer3 hat eine Methode namens downloadDataFromApi (Daten);

public Observable<Data> getData(String data) { 
    return Observable.create(new Observable.OnSubscribe<Data>() { 
     @Override 
     public void call(Subscriber<? super Data> subscriber) { 
      Data data = new Data(); 
      subscriber.onNext(data); 
      subscriber.onCompleted(); 
      // Can't find a way to connect to layer3. 
     } 
    }); 
} 

Was muss ich in Layer2 die getData() -Methode tun? Ich möchte grundsätzlich Logiken haben, bevor ich Observable zurück auf layer1 bringen kann.

Macht das Sinn?

Antwort

1

Aus was ich sehe, haben Sie 3 Schichten (Präsentation, Geschäftslogik, Datenzugriff).

Also, was Sie tun können, ist die folgende:

class PresentationLayer { 

    private BusinessLogicLayer layer; 

    PresentationLayer() { 
     layer = new BusinessLogicLayer(); 
    } 

    public void showName() { 
     layer.getNameWithoutRxPrefix() 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Consumer<String>() { 
        @Override 
        public void accept(String name) throws Exception { 
         // show name somewhere 
         Log.d("PresentationLayer", "name: " + name); 
        } 
       }); 
    } 
} 

class BusinessLogicLayer { 

    private DataAccessLayer layer; 

    BusinessLogicLayer() { 
     layer = new DataAccessLayer(); 
    } 

    public Observable<String> getNameWithoutRxPrefix() { 
     return layer.getName() 
       .map(new Function<String, String>() { 
        @Override 
        public String apply(String name) throws Exception { 
         return name.replace("Rx", ""); 
        } 
       }); 
    } 
} 

class DataAccessLayer { 

    public Observable<String> getName() { 
     return Observable.just("RxAndroid"); 
    } 
} 

Wie Sie sehen können, kehre ich ein beobachtbares in meiner Datenzugriffsschicht (getName) und Kette eine andere Methode, um es in meinem Business-Logik-Verfahren (map) vor der Rückgabe an die Präsentationsschicht.

2

Geben Sie einfach die Observable direkt zurück. Dann behandelt Schicht1 das Abonnement wie üblich.

class Layer2 { 
    public Observable<Data> getData(String data) { 
     return layer3.getData(data); 
    } 
} 
Verwandte Themen