Android REST Controller with Simple Cache Control Headers using Retrofit 1.9.0 + OkHttp 2.2.0
Last active
September 6, 2019 11:08
-
-
Save polbins/1c7f9303d2b7d169a3b1 to your computer and use it in GitHub Desktop.
Android Response Caching using Retrofit 1.9 + OkHttp 2.2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public abstract class RestController { | |
private static Context mContext; | |
private static long SIZE_OF_CACHE = 10 * 1024 * 1024; // 10 MB | |
protected 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 (ConnectivityHelper.isNetworkAvailable(mContext)) { | |
// 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(); | |
} | |
}; | |
} |
I tried this example, I want to make fresh network call and cache the data ,in case if there is no network it should pick from cache .
But using this code it always returns from cache .
Is there any way in which i can achieve this
@praveen18p - you have to remove them manually, something like this:
public static void removeFromCache(String urlString) {
try {
Iterator<String> it = mCache.urls();
while (it.hasNext()) {
String next = it.next();
if (next.contains(urlString)) {
it.remove();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
each cache is stored via its URL
Do we need to have the "Cache-Control" header in the HTTP response we receive, or will it work for responses without the cache-control header.
Interceptor not work for this code
Please , help me how to make
mCacheControlInterceptor is not worked .
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
good.