2016-08-19 13 views
6

रेट्रोफिट पोस्ट अनुरोध कैश स्टोर करने का सबसे अच्छा तरीका कौन सा है?एंड्रॉइड रेट्रोफिट पोस्ट अनुरोध कैश

मैं प्रतिक्रिया संग्रहीत करता हूं और उपयोगकर्ता का ऑफ़लाइन होने पर उस प्रतिक्रिया का उपयोग करता हूं। मुझे इस लिंक का उल्लेख किया गया था।
1) Can Retrofit with OKHttp use cache data when offline
2) Cache POST requests with OkHttp

लेकिन इस लिंक कैश तंत्र काम केवल विधि प्राप्त में।
- रेट्रोफिट का उपयोग कर पोस्ट अनुरोध में कैश स्टोर करना संभव है?
- क्या नेटवर्क लाइब्रेरी को संभालने के लिए कोई लाइब्रेरी है?

धन्यवाद

+1

संभव है या नहीं, POST अनुरोध सर्वर में डेटा बदलने के लिए हैं, क्या आप वाकई उन्हें कैश करना चाहते हैं? – lelloman

+0

मेरे मामले में हैलो @ एललोमन मुझे उपयोगकर्ता ऑफलाइन होने पर कैश से प्रतिक्रिया मिलेगी –

उत्तर

3

फ़ाइल कैश

+0

क्या आप अधिक जानकारी के लिए कुछ कोड प्रदान कर सकते हैं –

+0

OKHttp POST अनुरोधों के कैशिंग का समर्थन नहीं करता है, केवल जीईटी – galaxigirl

0

के लिए समर्थन 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 अनुरोध को निष्पादित करते समय एक पर्यवेक्षक सदस्यता लेता है, तो हम चाहते थे कि यह प्रतीक्षा करें और दो बार अनुरोध निष्पादित न करें, जब तक कि प्रगति में कोई असफल न हो। ऐसा करने के लिए सेमफोर ब्लॉक को एकल पहुंच की अनुमति देता है जो कैश किए गए अवलोकन योग्य बनाता है या देता है, और यदि कोई नया अवलोकन योग्य बनाया जाता है, तो हम उस तक प्रतीक्षा करते हैं जब तक कि वह समाप्त नहीं हो जाता।

संबंधित मुद्दे