मेरे पास Observable<<List<Foo>> getFoo()
है जो रेट्रोफिट सेवा से बनाया गया है और .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();
ऊपर दिया गया कोड उपर्युक्त व्यवहार को पुन: उत्पन्न कर सकता है। आप इसे डीबग कर सकते हैं और देख सकते हैं कि प्राप्त सूची एक अलग मेमोरी एड्रेस से संबंधित है।
मैंने कनेक्टेबल ऑब्सर्बल्स को एक संभावित समाधान के रूप में भी देखा है, लेकिन इसके लिए मुझे मूल अवलोकन करने की आवश्यकता है, और प्रत्येक बार जब मैं एक नया सब्सक्राइबर जोड़ना चाहता हूं तो .connect()
पर कॉल करना होगा।
.share()
के साथ इस प्रकार का व्यवहार रेट्रोफिट 1.9 तक ठीक काम कर रहा था। यह रेट्रोफिट 2 - बीटा पर काम करना बंद कर दिया। मैंने अभी तक रेट्रोफिट 2 रिलीज संस्करण के साथ इसका परीक्षण नहीं किया है, जिसे कुछ घंटे पहले रिलीज़ किया गया था।
संपादित करें: 01/02/2017
भविष्य पाठकों के लिए, मैं एक लेख here मामले के बारे में अधिक समझा लिखा है!
आपके उत्तर के लिए धन्यवाद। बात यह है कि मैं वास्तव में हर बार कॉलिंग से बचना चाहता हूं। क्या आप सुनिश्चित हैं कि रीप्ले ऑपरेटर इस उपयोग के मामले के साथ ठीक काम करेगा? – Pavlos
असल में मैंने इसका परीक्षण किया और यह काम किया। आपके समय और आपके उत्तर के लिए धन्यवाद। सिर्फ इस मुद्दे के लिए मैंने गर्म और ठंडे अवलोकनों के बीच अंतर पढ़ा है लेकिन रेट्रोफिट के साथ नेटवर्क कॉल के साथ इसे पुन: उत्पन्न नहीं कर सका। अगर मैंने एक Observable.just() का उपयोग किया था तो शेयर ऑपरेटर बहुत बढ़िया काम कर रहा था। – Pavlos