Retrofit – Okhttp-Client Wie kann ich die Antwort zwischenspeichern?

Ich versuche, die Antwort von http-Anrufen, die von Retrofit (v 1.9.0) mit OkHttp (2.3.0) durchgeführt wurden, zu cache. Es hat immer das Netzwerk angerufen, wenn ich versuche, einen Anruf ohne Internet zu machen, dann java.net.UnknownHostException .

RestClient

  • Erstellen eines Layouts ohne einen Rahmen, der die Hintergrundebene überlagert
  • SSLHandshakeException Trust Anker für Zertifizierungspfad nicht gefunden Android HTTPS
  • Getting "Fragment hat keine Ansicht" nach der Aufnahme von anderen Fragment ohne UI
  • Xamarin Android Player - Kann dieses Video nicht abspielen
  • Verwenden Sie JAXB (xjc) generierte Klassen in Android
  • Ist es in Ordnung, wenn wir die OnDestroy () - Methode in jeder Aktivität der Android Applikation überschreiben?
  •  public class RestClient { public static final String BASE_URL = "http://something.example.net/JSONService"; private com.ucc.application.rest.ApiService apiService; public RestClient() { Gson gson = new GsonBuilder() .setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'") .create(); RequestInterceptor requestInterceptor = new RequestInterceptor() { @Override public void intercept(RequestFacade request) { request.addHeader("Accept", "application/json"); int maxAge = 60 * 60; request.addHeader("Cache-Control", "public, max-age=" + maxAge); } }; RestAdapter restAdapter = new RestAdapter.Builder() .setLogLevel(RestAdapter.LogLevel.FULL) .setEndpoint(BASE_URL) .setClient(new OkClient(OkHttpSingleTonClass.getOkHttpClient())) .setConverter(new GsonConverter(gson)) .setRequestInterceptor(requestInterceptor) .build(); apiService = restAdapter.create(com.ucc.application.rest.ApiService.class); } public com.ucc.application.rest.ApiService getApiService() { return apiService; } } 

    OkHttpSingleTonClass

     public class OkHttpSingleTonClass { private static OkHttpClient okHttpClient; private OkHttpSingleTonClass() { } public static OkHttpClient getOkHttpClient() { if (okHttpClient == null) { okHttpClient = new OkHttpClient(); createCacheForOkHTTP(); } return okHttpClient; } private static void createCacheForOkHTTP() { Cache cache = null; cache = new Cache(getDirectory(), 1024 * 1024 * 10); okHttpClient.setCache(cache); } public static File getDirectory() { final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "UCC" + File.separator); root.mkdirs(); final String fname = UserUtil.CACHE_FILE_NAME; final File sdImageMainDirectory = new File(root, fname); return sdImageMainDirectory; } } 

    Meine Aktivität

     Request request = new Request.Builder() .cacheControl(new CacheControl.Builder() .onlyIfCached() .maxAge(60 * 60, TimeUnit.SECONDS) .build()) .url(RestClient.BASE_URL + Constants.GET_ABOUT_US_COLLECTION + "?userid=59e41b02-35ed-4962-8517-2668b5e8dae3&languageid=488d8f13-ef7d-4a3a-9516-0e0d24cbc720") .build(); Log.d("url_request", RestClient.BASE_URL + Constants.GET_ABOUT_US_COLLECTION + "/?userid=10"); com.squareup.okhttp.Response forceCacheResponse = null; try { forceCacheResponse = OkHttpSingleTonClass.getOkHttpClient().newCall(request).execute(); } catch (IOException e) { e.printStackTrace(); } if (forceCacheResponse.code() != 504) { // The resource was cached! Show it. Log.d("From", "Local"); Toast.makeText(AboutUs.this, "Local", Toast.LENGTH_SHORT).show(); } else { // The resource was not cached. Log.d("From", "Network"); Toast.makeText(AboutUs.this, "Network", Toast.LENGTH_SHORT).show(); getAbouUsDetails();//This will use the Apiservice interface to hit the server. } 

    Ich folgte dem. Aber ich kann es nicht schaffen zu arbeiten. Es schlägt einfach vom Server. Was mache ich falsch?

  • Wie funktioniert getContentResolver ()?
  • Android wie man String-Ressource in einer Java-Klasse verwenden
  • Unterstützt Android JDK 6 oder 7
  • Android DialogFragment onViewCreated nicht aufgerufen
  • Force-Anwendung zum Neustart von der ersten Aktivität (wenn eine Berechtigung verweigert wird)
  • Android Silent Push
  • One Solution collect form web for “Retrofit – Okhttp-Client Wie kann ich die Antwort zwischenspeichern?”

    Wie pro Retrofit 1.9.0 die OkClient hat keine Caching-Unterstützung. Wir müssen OkHttpClient Instanz von Square OkHttpClient Bibliothek verwenden.

    Sie können kompilieren durch compile 'com.squareup.okhttp:okhttp:2.3.0'

    Vor allem Nachrüstung Caches durch Antwort-Header wie

    Cache-Control:max-age=120,only-if-cached,max-stale

    ** 120 ist Sekunden.

    Sie können hier mehr über Header lesen .

    Caching-Header werden meist von Server-Antwort beauftragt. Versuchen Sie, Cache-Header in Servern zu implementieren. Wenn du keine Option hast, ja Nachrüstung hat es.

     private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Response originalResponse = chain.proceed(chain.request()); return originalResponse.newBuilder() .header("Cache-Control", String.format("max-age=%d, only-if-cached, max-stale=%d", 120, 0)) .build(); } }; 

    Wo zum Zwischenspeichern:

     private static void createCacheForOkHTTP() { Cache cache = null; cache = new Cache(getDirectory(), 1024 * 1024 * 10); okHttpClient.setCache(cache); } // returns the file to store cached details private File getDirectory() { return new File(“location”); } 

    Fügen Sie der OkHttpClient-Instanz einen Interceptor hinzu:

     okHttpClient.networkInterceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR); 

    Und schließlich füge OkHttpClient zum RestAdapter hinzu:

     RestAdapter.setClient(new OkClient(okHttpClient)); 

    Und du kannst durch diese Folie für mehr Referenz gehen.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.