Retrofit2 + Rxjava +Cache 机制+EventBus,新增Token失效处理方案,mobile network 情况下缓存一分钟过期重新请求,wifi 情况下不使用缓存,none network 情况下直接读取缓存并离线缓存4周。
private final static Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); //获取网络状态 int netWorkState = NetUtils.getNetworkState(RxApplication.getInstance()); //无网络,请求强制使用缓存 if (netWorkState == NetUtils.NETWORN_NONE) { request = request.newBuilder() .cacheControl(CacheControl.FORCE_CACHE) .build(); } Response originalResponse = chain.proceed(request); switch (netWorkState) { case NetUtils.NETWORN_MOBILE://mobile network 情况下缓存一分钟 int maxAge = 60; return originalResponse.newBuilder() .removeHeader("Pragma") .removeHeader("Cache-Control") .header("Cache-Control", "public, max-age=" + maxAge) .build(); case NetUtils.NETWORN_WIFI://wifi network 情况下不使用缓存 maxAge = 0; return originalResponse.newBuilder() .removeHeader("Pragma") .removeHeader("Cache-Control") .header("Cache-Control", "public, max-age=" + maxAge) .build(); case NetUtils.NETWORN_NONE://none network 情况下离线缓存4周 int maxStale = 60 * 60 * 24 * 4 * 7; return originalResponse.newBuilder() .removeHeader("Pragma") .removeHeader("Cache-Control") .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) .build(); default: throw new IllegalStateException("network state is Erro!"); } } }; public class TokenAuthenticator implements Authenticator { @Override public Request authenticate(Route route, Response response) throws IOException { //取出本地的refreshToken String refreshToken = PreferenceUtils.getPrefString(RxApplication.getInstance(),"refreshToken",""); RefreshRequest refreshRequest = new RefreshRequest(refreshToken); // 通过一个特定的接口获取新的token,此处要用到同步的retrofit请求 ServiceApi service = ServiceFactory.createRetrofit2(ServiceApi.class); Call<Token> call = service.refresh(refreshRequest); //要用retrofit的同步方式 Token token = call.execute().body(); PreferenceUtils.setPrefString(RxApplication.getInstance(),"refreshToken",token.getRefresh_token()); return response.request().newBuilder() .header("X-ZUMO-AUTH", token.getAccess_token()) .build(); } } http://stackoverflow.com/questions/36008207/how-to-run-android-code-in-eclipse
To fix this, i have to go in my project.properties file, And in this file add this line : sdk.buildtools=23.0.2
http://blog.csdn.net/cxc19890214/article/details/47430547
Think in java
Effective java
Clean code
https://github.com/cheng2016/RxJava-Android-Samples
https://github.com/cheng2016/RxJava
- Github: github.com/cheng2016
- Email: mitnick.cheng@outlook.com
- QQ: 1102743539

