2016-08-19 26 views
6

?Android Retrofitler POST isteği önbellek

Ben tepkisi ve kullanıcı çevrimdışı iken bu tepkiyi kullanarak saklar. Bu bağlantıya yönlendirildim.
1) Can Retrofit with OKHttp use cache data when offline
2)

Ama bu bağlantı önbellek mekanizması çalışmalar yalnızca yöntemi GET içinde Cache POST requests with OkHttp.
- Bu güçlendirme kullanarak sonrası isteğinde önbellek saklamak mümkündür?
- Ağ önbelleğini işlemek için herhangi bir kütüphane var mı?

Teşekkür

+1

, POST istekleri sunucudaki verileri değiştirmek içindir, onları önbelleğe almak istediğinden emin misin? Kullanıcı – lelloman

+0

Merhaba @lelloman ben önbellekten yanıtını alacak, sadece GET –

cevap

3

dosya önbelleği

+0

Eğer OKHttp POST istekleri önbelleğe DESTEKLEMEZ fazla ayrıntı –

+0

için bazı kodlar verir misiniz çevrimdışı iken benim durumumda – galaxigirl

0

için destek OkHttp Bu Biz Retrofit bir HTTP isteğinin sonucunu önbelleğe gerekiyordu biz

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(); 
    } 
} 

ile sona erdi çözümdür. Yani bu, akılda tek bir madde yayan bir gözlemlenebilir ile yaratıldı.

HTTP isteği yürütüldükten abone gözlemci, bunun beklemek ve geliştirilmekte biri başarısız olmadıkça, iki defa isteği yürütmek değil isteseydim. Bunu yapmak için semafor, önbelleğe alınan gözlemlenebilir olanı yaratan veya döndüren bloğa tek bir erişime izin verir ve yeni bir gözlemlenebilir oluşturulduysa, o zamana kadar bekleriz. mümkün ya da değil