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
Lepaskan: 2024-11-05 06:38:02
asal
708 orang telah melayarinya

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>
    Salin selepas log masuk
  • 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>
    Salin selepas log masuk
  • Sepadukan OkHttpClient dengan Retrofit:

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

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>
    Salin selepas log masuk

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>
    Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan