2017-05-18 8 views
0

これが可能性はあるのかどうかはわかりませんが、Realmを使用してキャッシュとしてカスタムキャッシング戦略を実現しようとしています。残念ながら、エンティティをRealmレスポンス本体にコピーするには、RealmObjectを拡張する必要があります。明らかに私のレスポンスボディはすべてそうですが、レスポンスとレスポンスボディはインターセプト時にレスポンスクラスのタイプを知らないのです。Retrofit2インターセプタ(レルムのキャッシング)でレスポンスクラスのタイプを取得

は、私はこのような何かをしたい(しかし、後に実装キャッシュ戦略で):

httpClient.addInterceptor(new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request request = chain.request(); 
      Response response = chain.proceed(request); 
      // Somewhere here will be the caching strategy 
      Realm.getDefaultInstance().copyToRealmOrUpdate(response.body()); 
      return response; 
     } 
    }); 

まず - それも可能ですか?はいの場合は、どのように。私には明らかな解決策はありません。これは私がAPI消費者のクライアントレベルでキャッシングを行う必要がありますことはできません場合は...

+0

ローカルルームインスタンスを開いているため、決して閉じることができません。バックグラウンド非ルーパースレッドで問題が発生する可能性があります。これはネットワーク要求のインターセプタです。 – EpicPandaForce

+0

@EpicPandaForceあなたが正しいです、仕事が終わったときに私はそれを閉じなければなりませんが、これは質問の焦点では​​ありませんでした。とにかくありがとう! – Necroqubus

+0

@Necroqubus:提案は機能しましたか?もしそうなら、あなたはそれを受け入れることができますか? ...そうでない場合は、代替案を提案できますか? –

答えて

1

さてあなたはに次のことを試すことができます。

httpClient.addInterceptor(new Interceptor() { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 
     Response response = chain.proceed(request); 
     // Somewhere here will be the caching strategy 
     Object object = response.body(); 
     if(object != null) { 
      try(Realm r = Realm.getDefaultInstance()) { 
       r.executeTransaction((realm) -> { 
        realm.copyToRealmOrUpdate((RealmObject)object); 
       }); 
      } 
     } 
     return response; 
    } 
}); 

私はそれがうまくいくという保証はありませんが、 。

関連する問題