के लिए समर्थन OkHttp यह समाधान हम
public class OnErrorRetryCache<T> {
public static <T> Observable<T> from(Observable<T> source) {
return new OnErrorRetryCache<>(source).deferred;
}
private final Observable<T> deferred;
private final Semaphore singlePermit = new Semaphore(1);
private Observable<T> cache = null;
private Observable<T> inProgress = null;
private OnErrorRetryCache(Observable<T> source) {
deferred = Observable.defer(() -> createWhenObserverSubscribes(source));
}
private Observable<T> createWhenObserverSubscribes(Observable<T> source)
{
singlePermit.acquireUninterruptibly();
Observable<T> cached = cache;
if (cached != null) {
singlePermit.release();
return cached;
}
inProgress = source
.doOnCompleted(this::onSuccess)
.doOnTerminate(this::onTermination)
.replay()
.autoConnect();
return inProgress;
}
private void onSuccess() {
cache = inProgress;
}
private void onTermination() {
inProgress = null;
singlePermit.release();
}
}
साथ समाप्त हो गया हम रेट्रोफिट से एक HTTP अनुरोध का परिणाम कैश करने के लिए की जरूरत है। तो यह एक अवलोकन के साथ बनाया गया था जो एक ही आइटम को दिमाग में छोड़ देता है।
यदि HTTP अनुरोध को निष्पादित करते समय एक पर्यवेक्षक सदस्यता लेता है, तो हम चाहते थे कि यह प्रतीक्षा करें और दो बार अनुरोध निष्पादित न करें, जब तक कि प्रगति में कोई असफल न हो। ऐसा करने के लिए सेमफोर ब्लॉक को एकल पहुंच की अनुमति देता है जो कैश किए गए अवलोकन योग्य बनाता है या देता है, और यदि कोई नया अवलोकन योग्य बनाया जाता है, तो हम उस तक प्रतीक्षा करते हैं जब तक कि वह समाप्त नहीं हो जाता।
स्रोत
2017-12-08 06:06:46
संभव है या नहीं, POST अनुरोध सर्वर में डेटा बदलने के लिए हैं, क्या आप वाकई उन्हें कैश करना चाहते हैं? – lelloman
मेरे मामले में हैलो @ एललोमन मुझे उपयोगकर्ता ऑफलाइन होने पर कैश से प्रतिक्रिया मिलेगी –