2016-06-30 20 views
10

Sunucudan veri istemek için retrofit 2 ve OkHttp3 kullanıyorum. Sadece bir çevrimdışı önbellek kodu ekledim ama beklendiği gibi çalışmıyor. "Ana makine çözülemedi" hatası: <> ": Ana bilgisayar adıyla ilişkili adres yok."Bu hatayı retrofit2 & OkHttp3 ile aldım. "<host-name>" ana makine çözümlenemiyor: Ana makine adıyla ilişkili adres yok

Bu, önbellekten alınan verileri almayı denediğinde ortaya çıkar (Internet bağlantısı olmadığında). Bir kod snippet'i aşağıda.

public static Interceptor provideCacheInterceptor() { 
    return new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Response response = chain.proceed(chain.request()); 

      // re-write response header to force use of cache 
      CacheControl cacheControl = new CacheControl.Builder() 
        .maxAge(2, TimeUnit.MINUTES) 
        .build(); 

      return response.newBuilder() 
        .header(CACHE_CONTROL, cacheControl.toString()) 
        .build(); 
     } 
    }; 
} 

public static Interceptor provideOfflineCacheInterceptor() { 
    return new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request request = chain.request(); 

      if (!hasNetwork) { 
       CacheControl cacheControl = new CacheControl.Builder() 
         .onlyIfCached() 
         .maxStale(7, TimeUnit.DAYS) 
         .build(); 

       request = request.newBuilder() 
         .removeHeader("Pragma") 
         .cacheControl(cacheControl) 
         .build(); 
      } 

      return chain.proceed(request); 
     } 
    }; 
} 

private static Cache provideCache() { 
    Cache cache = null; 
    try { 
     cache = new Cache(new File(AdeptAndroid.getInstance().getCacheDir(), "http-cache"), 
       10 * 1024 * 1024); // 10 MB 
    } catch (Exception e) { 
     Log.d("Test", "Could not create Cache!"); 
    } 
    return cache; 
} 

Ve sonunda bunların tümünü birleştiren bir yöntem burada.

private static OkHttpClient provideOkHttpClient() { 
    return new OkHttpClient.Builder() 
      .addInterceptor(provideHttpLoggingInterceptor()) 
      .addInterceptor(provideOfflineCacheInterceptor()) 
      .addNetworkInterceptor(provideCacheInterceptor()) 
      .cache(provideCache()) 
      .build(); 
} 
+0

Başlığı bu şekilde ayarlama (tam olarak 50000) sorunu çözdü. .header ("Önbellek Denetimi", String.format ("max-age =% d", 50000)) –

+0

@WaqarYounis Cevabınız için teşekkürler, ancak çalışmıyor. –

+0

Bu sorunu çözdünüz mü? Uygulamayı GCM kullanarak arka plandan uyandırırken bu sorunu yaşıyorum. –

cevap

1

Sunucu yanıtınızda "Pragma: no-cache" başlığı var. Bu engeli, yanıt ara vericinizdeki istek kesicinizden çıkarmalısınız.

Geçerli kodunuzda, istek engelleyiciden kaldırdınız.

Sizin provideCacheInterceptor() bu gibi görünmelidir: bağlantı sorunu, benim dava wifi devre dışı bırakıldı ve tüm bu sorunlara neden çünkü

Aslında
public static Interceptor provideCacheInterceptor() { 
    return new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Response response = chain.proceed(chain.request()); 

      // re-write response header to force use of cache 
      CacheControl cacheControl = new CacheControl.Builder() 
        .maxAge(2, TimeUnit.MINUTES) 
        .build(); 

      return response.newBuilder() 
        .header(CACHE_CONTROL, cacheControl.toString()) 
        .removeHeader("Pragma") 
        .build(); 
     } 
    }; 
} 
0

o, cevabı buldum nerede bu link bulabilirsiniz edilir

İlgili konular