2016-08-19 44 views
6

保存する最善の方法はどれですかretrofit POSTリクエストキャッシュ?Android Retrofit POSTリクエストキャッシュ

私は応答を保存し、ユーザーがオフラインの間にその応答を使用します。私はこのリンクを参照されました。
1)Can Retrofit with OKHttp use cache data when offline
2)Cache POST requests with OkHttp

しかし、唯一のこのリンクキャッシュ機構の作業方法をGET。
- ポストリクエストにレトロフィットを使用してキャッシュを保存することは可能ですか?
- ネットワークキャッシュを処理するライブラリはありますか?

おかげ

+1

可能かどうか、POSTリクエストはサーバー内のデータを変更するためのものですが、キャッシュしてもよろしいですか? – lelloman

+0

こんにちは@lelloman私のケースでは、ユーザーがオフラインのときにキャッシュからの応答を得ます。 –

答えて

3

これは、我々は我々がレトロフィットからのHTTPリクエストの結果をキャッシュするために必要な

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

になってしまったソリューションであり、ファイルキャッシュ

+0

詳細についてはいくつかのコードを提供してください。 –

+0

OKHttpはPOST要求のキャッシュをサポートせず、GET – galaxigirl

0

をサポートしていOkHttp。これは、単一のアイテムを念頭に置いて観察できるように作成されました。

HTTPリクエストの実行中にオブザーバーが購読していた場合、進行中のリクエストが失敗しない限り、リクエストを2回実行しないようにします。そうするために、セマフォは、キャッシュされた観測可能オブジェクトを作成または返すブロックへの単一アクセスを許可し、新しい観測オブジェクトが作成されると、その観測オブジェクトが終了するまで待機します。

関連する問題