私はをRetrofitサービスから作成し、 .getFoo()
メソッドを呼び出した後、複数のサブスクライバと共有する必要があります。ただし、.share()
メソッドを呼び出すと、ネットワークコールが再実行されます。リプレイオペレータは動作しません。私は潜在的な解決策が.cache()
かもしれないことを知っていますが、なぜこの動作が引き起こされるのかわかりません。複数の利用者が閲覧可能なシングル
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
// Create an instance of our GitHub API interface.
// 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();
上記のコードは、前述の動作を再現できます。それをデバッグして、受け取ったListが別のMemoryAddressに属していることを確認できます。
私は潜在的な解決策としてConnectable Observablesも見てきましたが、元の観測可能性を持ち、新しいサブスクライバを追加するたびに.connect()
を呼び出す必要があります。
この種の動作は.share()
であり、Retrofit 1.9までは正常に動作していました。それはRetrofit 2 - betaでの作業を停止しました。私は数時間前にリリースされたRetrofit 2 Release Versionでまだテストしていません。
EDIT:将来の読者のために2017年1月2日
、私はケースの詳細を説明する記事hereを書かれています!
ありがとうございました。問題は、毎回connectを呼び出すことを避けたいということです。リプレイ演算子がこのユースケースで正常に動作することは確かですか? – Pavlos
実際に私はそれをテストし、それは働いた。お時間をいただきありがとうございます。この問題のために、私は暑い気候と寒い気候の違いを読んだが、Retrofitのネットワークコールではそれを再現できませんでした。 Observable.just()を使用した場合、共有演算子はかなりうまく動作していました。 – Pavlos