Rumah >Java >javaTutorial >Bolehkah Retrofit dengan OKHttp Menggunakan Data Cache Apabila Luar Talian?

Bolehkah Retrofit dengan OKHttp Menggunakan Data Cache Apabila Luar Talian?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-05 06:38:02794semak imbas

Can Retrofit with OKHttp Utilize Cached Data When Offline?

Bolehkah Retrofit dengan OKHttp Menggunakan Data Cache Apabila Luar Talian?

Dalam percubaan untuk cache respons HTTP menggunakan Retrofit dan OKHttp, anda menghadapi isu tersebut untuk mendapatkan RetrofitError UnknownHostException apabila di luar talian. Ini menunjukkan bahawa Retrofit tidak dapat mendapatkan semula data cache. Pengubahsuaian berikut diperlukan untuk menyelesaikan isu ini:

Edit untuk Retrofit 2.x:

  • Laksanakan Pemintas OkHttp untuk mengurus logik caching:

    <code class="java">private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
      @Override
      public Response intercept(Chain chain) throws IOException {
          Response originalResponse = chain.proceed(chain.request());
          if (Utils.isNetworkAvailable(context)) {
              int maxAge = 60; // read from cache for 1 minute
              return originalResponse.newBuilder()
                      .header("Cache-Control", "public, max-age=" + maxAge)
                      .build();
          } else {
              int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
              return originalResponse.newBuilder()
                      .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                      .build();
          }
      }
    }</code>
  • Konfigurasikan OkHttpClient dengan pemintas dan cache:

    <code class="java">OkHttpClient client = new OkHttpClient();
    client.networkInterceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR);
    
    //setup cache
    File httpCacheDirectory = new File(context.getCacheDir(), "responses");
    int cacheSize = 10 * 1024 * 1024; // 10 MiB
    Cache cache = new Cache(httpCacheDirectory, cacheSize);
    
    //add cache to the client
    client.setCache(cache);</code>
  • Sepadukan OkHttpClient dengan Retrofit:

    <code class="java">Retrofit retrofit = new Retrofit.Builder()
          .baseUrl(BASE_URL)
          .client(client)
          .addConverterFactory(GsonConverterFactory.create())
          .build();</code>

OKHttp 2.0.x:

  • Laraskan persediaan pelanggan anda untuk mencerminkan sintaks yang dikemas kini:

    <code class="java">      File httpCacheDirectory = new File(context.getCacheDir(), "responses");
    
          Cache cache = null;
          try {
              cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);
          } catch (IOException e) {
              Log.e("OKHttp", "Could not create http cache", e);
          }
    
          OkHttpClient okHttpClient = new OkHttpClient();
          if (cache != null) {
              okHttpClient.setCache(cache);
          }
          ...</code>

Jawapan Asal:

  • Pastikan respons pelayan mengandungi Cache-Control: awam untuk membolehkan Retrofit membaca daripada cache.
  • Laksanakan pemintas permintaan yang menetapkan pengepala Cache-Control berdasarkan ketersediaan rangkaian:

    <code class="java">RestAdapter.Builder builder= new RestAdapter.Builder()
     .setRequestInterceptor(new RequestInterceptor() {
          @Override
          public void intercept(RequestFacade request) {
              request.addHeader("Accept", "application/json;versions=1");
              if (MyApplicationUtils.isNetworkAvailable(context)) {
                  int maxAge = 60; // read from cache for 1 minute
                  request.addHeader("Cache-Control", "public, max-age=" + maxAge);
              } else {
                  int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
                  request.addHeader("Cache-Control", 
                      "public, only-if-cached, max-stale=" + maxStale);
              }
          }
    });</code>

Dengan melaksanakan pengubahsuaian ini, Retrofit akan menggunakan data cache dengan betul semasa di luar talian, sebagai asalkan respons pelayan termasuk pengepala Kawalan Cache yang sesuai.

Atas ialah kandungan terperinci Bolehkah Retrofit dengan OKHttp Menggunakan Data Cache Apabila Luar Talian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn