Single Observable with Multiple Subscribers

Ich habe einObservable<<List<Foo>> getFoo() das von einem Retrofit-Service erstellt wird und nach dem Aufruf des.getFoo() -Methode muss ich es mit mehreren Abonnenten teilen. Aufruf des.share() -Methode bewirkt jedoch, dass der Netzwerkaufruf erneut ausgeführt wird. Replay Operator funktioniert auch nicht. Ich weiß, dass eine mögliche Lösung sein könnte.cache(), aber ich weiß nicht, warum dieses Verhalten verursacht wird.

// Create an instance of our GitHub API interface.
Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(API_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();

// Create a call instance for looking up Retrofit contributors.
Observable<List<Contributor>> testObservable = retrofit
        .create(GitHub.class)
        .contributors("square", "retrofit")
        .share();

Subscription subscription1 = testObservable
       .subscribe(new Subscriber<List<Contributor>>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable throwable) {

            }

            @Override
            public void onNext(List<Contributor> contributors) {
                System.out.println(contributors);
            }
         });

Subscription subscription2 = testObservable
        .subscribe(new Subscriber<List<Contributor>>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable throwable) {

            }

            @Override
            public void onNext(List<Contributor> contributors) {
                System.out.println(contributors + " -> 2");
            }
         });

subscription1.unsubscribe();
subscription2.unsubscribe();

Der obige Code kann das oben genannte Verhalten reproduzieren. Sie können es debuggen und sehen, dass die empfangenen Listen zu einer anderen MemoryAddress gehören.

Ich habe auch ConnectableObservables als mögliche Lösung angesehen, aber dazu muss ich das ursprüngliche Observable bei mir tragen und @ anrufe.connect() Jedes Mal, wenn ich einen neuen Abonnenten hinzufügen möchte.

Diese Art von Verhalten mit dem.share() funktionierte gut bis Retrofit 1.9. Bei Retrofit 2 - beta funktionierte es nicht mehr. Ich habe es mit der vor einigen Stunden veröffentlichten Release-Version von Retrofit 2 noch nicht getestet.

EDIT: 02.01.2017

Für zukünftige Leser habe ich einen Artikel geschriebenHie erklären mehr über den Fall!

Antworten auf die Frage(4)

Ihre Antwort auf die Frage