RxJava2+Retrofit2+OkHttp3实现网络缓存


最近在网上看到了很多带有网络缓存的封装库 ,于是心血来潮打算自己也撸一串代码助助兴

现在最火的网络请求就是retrofit'和rxjava连用了 于是我就按照项求撸了一段带有网络缓存的retrofit.


//就是这么轻松加愉快 水友们不要客气直接拿去享用就行 再也不用担心断网看不到数据了
//废话不多说直接上代码

package com.example.administrator.myexample;
现在最火的网络请求就是retrofit'和rxjava连用了 于是我就按照项求撸了一段带有网络缓存的retrofit.

//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼                  BUG辟易  
//          佛曰:  
//                  写字楼里写字间,写字间里程序员;  
//                  程序人员写程序,又拿程序换酒钱。  
//                  酒醒只在网上坐,酒醉还来网下眠;  
//                  酒醉酒醒日复日,网上网下年复年。  
//                  但愿老死电脑间,不愿鞠躬老板前;  
//                  奔驰宝马贵者趣,公交自行程序员。  
//                  别人笑我忒疯癫,我笑自己命太贱;  
//                  不见满街漂亮妹,哪个归得程序员?  


import android.util.Log;

import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

import okhttp3.Cache;
import okhttp3.CacheControl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * 添加了网络缓存retrofit
 */

public class Api {
    public static final String BASE_URL = "http://app.vmoiver.com";
    public static final String TAG = Api.class.getSimpleName();
    private static ApiService apiService;

    public static ApiService getApiService() {
        if (apiService == null) {
            synchronized (Api.class) {
                if (apiService == null) {
                    initApiService();
                }
            }
        }
        return apiService;
    }

    private static void initApiService() {

        File httpCacheDirectory = new File(MyApp.getContext().getExternalCacheDir(), "responses");
        Cache cache = new Cache(httpCacheDirectory, 50 * 1024 * 1024);
        //缓存路径
        //String str=mFile.getAbsolutePath().toString();
        // Log.e("Caches",str);
        //拦截器
        Interceptor mRewriteCacheControlInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                if (!NetWorkUtils.isNetworkReachable(MyApp.getContext())) {
                    request = request.newBuilder()
                            .cacheControl(CacheControl.FORCE_CACHE)
                            .build();
                }
                Response originalResponse = chain.proceed(request);
                if (!NetWorkUtils.isNetworkReachable(MyApp.getContext())) {
                    String cacheControl = request.cacheControl().toString();
                    return originalResponse.newBuilder()
                            .removeHeader("Pragma")
                            .header("Cache-Control", cacheControl)
                            .build();
                } else {
                    return originalResponse.newBuilder()
                            .removeHeader("Pragma")
                            .header("Cache-Control", "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 2)
                            .build();
                }
            }
        };

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cache(cache)
                .addInterceptor(mRewriteCacheControlInterceptor)
                .addNetworkInterceptor(mRewriteCacheControlInterceptor)
                .retryOnConnectionFailure(true)
                .connectTimeout(15, TimeUnit.SECONDS)
                .build();


        Retrofit retrofit = new Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        apiService = retrofit.create(ApiService.class);
    }

}
//就是这么轻松加愉快 水友们不要客气直接拿去享用就行 再也不用担心断网看不到数据了

你可能感兴趣的:(Android)