2016-03-19 10 views
0

Ich habe einen sehr einfachen RXJava Emitter. Es ist eigentlich ein publishSubject, aber seine Aufgabe besteht darin, Integer in Strings umzuwandeln und ein UI-Element nachträglich zu aktualisieren, wenn es abonniert wird. Der Code sieht wie folgt aus:RxJava - single Observable sofort ausführbar - warum?

PublishSubject integerToStringEmitter = PublishSubject.create(); 

    Subscription mysingle= Single.just(4).map(new Func1<Integer, String>() { 


     @Override 
     public String call(Integer integer) { 
      return String.valueOf(integer); 
     } 
    }).subscribe(new Observer<String>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(String s) { 
      tv.setText(s); 
     } 
    }); 
// integerToStringEmitter.subscribe(); //it still emits even without this, why ? 

Was ich mag geschehen: zum Bezug erst beginnen, wenn i integerToStringEmitter.subscribe nennen();

Was passiert gerade: Sobald ich das Programm starte, wird OnNext aufgerufen und das UI-Element wird auf # 4 gesetzt. Warum? Ich brauche mehr Kontrolle über dieses Ding, damit es nicht sofort ausgeführt wird, ohne dass ich es abonniere. Bitte helfen Sie zu lösen.

Antwort

2

Ich bin mir nicht sicher, was Sie erreichen möchten. Ihr Code sieht nicht richtig aus und sollte nicht einmal kompiliert werden. Wenn es kompilieren würde, dann würde der subscribe (new Observer() {... Teil offensichtlich den Ereignisstrom auslösen.

Hier ist ein einfaches Beispiel für eine Observable emittierende Ganzzahlen und Mapping sie auf Strings und einem Observer abonnieren:

Observable<String> myObservable = Observable.just(1, 2, 3, 4).map(new Func1<Integer, String>() { 
    @Override 
    public String call(Integer integer) { 
     return String.valueOf(integer); 
    } 
}); 

Subscriber<String> mySubscriber = new Subscriber<String>() { 
    @Override 
    public void onCompleted() { 
     System.out.println("onCompleted"); 
    } 

    @Override 
    public void onError(Throwable e) { 
     System.out.println("onError: " + e.getMessage()); 
    } 

    @Override 
    public void onNext(String s) { 
     System.out.println("onNext: " +s); 
    } 
}; 

myObservable.subscribe(mySubscriber); 
+0

Es kompiliert gut.Ich fehlte, um den Abonnenten nicht zu ketten. Vielen Dank guten Rat. – j2emanue