/Retrofit2RxJava-Android-Simples

Retrofit2 + Rxjava +Cache 机制+EventBus,新增Token失效处理方案,mobile network 情况下缓存一分钟过期重新请求,wifi 情况下不使用缓存,none network 情况下直接读取缓存并离线缓存4周。

Primary LanguageJava

Retrofit2RxJava-Android-Simples

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!");
        }
    }
};

Token过期处理机制

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();
   }
}

###Unsupported major.minor version 52.0 问题解决方案 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

##推荐书籍 Think in java

Effective java

Clean code