2016-09-08 2 views
0

Я использую Retrofit 1.9. + И okhttp: 2.2. +.Модернизация http Проверка кэша-контроля Отправка назад Кэш, даже если он устарел и снова выполняет сетевой вызов

Я хотел бы кэшировать свои ответы. Я сделал это с Okclient перехватчиков следующим образом:

public abstract class RestController { 
private static Context mContext; 
private static long SIZE_OF_CACHE = 10 * 1024 * 1024; // 10 MB 

public static RestAdapter mRestAdapter; 

public static void init(final Context context, String baseAPIUrl) { 
    mContext = context; 

    // Create Cache 
    Cache cache = null; 
    try { 
     cache = new Cache(new File(mContext.getCacheDir(), "http"), SIZE_OF_CACHE); 
    } catch (IOException e) { 
     Log.e(RestController.class.getSimpleName(), "Could not create Cache!", e); 
    } 

    // Create OkHttpClient 
    OkHttpClient okHttpClient = new OkHttpClient(); 
    okHttpClient.setCache(cache); 
    okHttpClient.setConnectTimeout(30, TimeUnit.SECONDS); 
    okHttpClient.setReadTimeout(30, TimeUnit.SECONDS); 

    // Add Cache-Control Interceptor 
    okHttpClient.networkInterceptors().add(mCacheControlInterceptor); 

    // Create Executor 
    Executor executor = Executors.newCachedThreadPool(); 

    mRestAdapter = new RestAdapter.Builder() 
      .setEndpoint(baseAPIUrl) 
      .setExecutors(executor, executor) 
      .setClient(new OkClient(okHttpClient)) 
      .setLogLevel(RestAdapter.LogLevel.FULL) 
      .build(); 
} 

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

     // Add Cache Control only for GET methods 
     if (request.method().equals("GET")) { 
      if (isNetworkAvailable()) { 
       // 1 day 
       request.newBuilder() 
         .header("Cache-Control", "only-if-cached") 
         .build(); 
      } else { 
       // 4 weeks stale 
       request.newBuilder() 
         .header("Cache-Control", "public, max-stale=2419200") 
         .build(); 
      } 
     } 

     Response response = chain.proceed(request); 

     // Re-write response CC header to force use of cache 
     return response.newBuilder() 
       .header("Cache-Control", "public, max-age=86400") // 1 day 
       .build(); 
    } 
}; 

public static Boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
    if (networkInfo == null) { 
     return false; 
    } 
    NetworkInfo.State network = networkInfo.getState(); 
    return (network == NetworkInfo.State.CONNECTED || network == NetworkInfo.State.CONNECTING); 
} 

}

Теперь мне нужно реализовать логику отдавая кэш. Мой кэш должен иметь два показателя: 1 fresh_upto 2 Выбросьте

Тогда логика как if(cache is present and current time <live upto){ send back cache } else if(current time<throwawaytime and current time >live upto){ send back cache make another network call onresponse send the new data back }

, как я могу добиться этого с контролем кэша. могу ли я использовать max-age или max-stale для этого?

+0

Здравствуйте, ваша проблема решена? Мне нужен аналогичный вид решения –

+0

@MayuriRuparel Извините, но я реализовал кэширование SQLite для своих ответов для достижения этого. Я не уверен, если это возможно с помощью Retrofit. –

ответ

1

Попробуйте это для модернизации он работает в моем проекте

@Headers("Cache-Control: max-age=" + (MINUTE)) @GET("your Url") Call<ResponseBody> getCourseStructureFromCache("Your Request paramater and all");

Смежные вопросы