Android REST Controller with Simple Cache Control Headers using Retrofit 1.9.0 + OkHttp 2.2.0
-
-
Save jjhesk/bc6060fbdbd90601f1cd 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(); | |
} | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment