美文网首页
Retrofit网络请求基本配置

Retrofit网络请求基本配置

作者: HangChen | 来源:发表于2017-06-01 03:37 被阅读0次

    NetworkUtils.java

    import android.content.Context;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    public class NetworkUtils {
        /**
         * 获取活动网路信息
         *
         * @param context 上下文
         * @return NetworkInfo
         */
        private static NetworkInfo getActiveNetworkInfo(Context context) {
            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            return cm.getActiveNetworkInfo();
        }
        /**
         * 判断网络是否可用
         * <p>需添加权限 android.permission.ACCESS_NETWORK_STATE</p>
         */
        public static boolean isAvailable(Context context) {
            NetworkInfo info = getActiveNetworkInfo(context);
            return info != null && info.isAvailable();
        }
    
    }
    

    RetrofitApplication.java

    import android.app.Application;
    import android.content.Context;
    public class RetrofitApplication extends Application {
        private static RetrofitApplication application;
    
        @Override
        public void onCreate() {
            super.onCreate();
            application = this;
        }
    
        private RetrofitApplication getApplication(){
            return application;
        }
        public static Context getContext(){
            return  application.getApplicationContext();
        }
    
    }
    

    RetrofitManager.java

    import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
    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 okhttp3.logging.HttpLoggingInterceptor;
    import retrofit2.Retrofit;
    import retrofit2.converter.gson.GsonConverterFactory;
    public class RetrofitManager {
        private static final String CACHE_NAME  = "retrofitcache";
        private static Retrofit retrofit = null;
        private static String url = "";
        public static Retrofit getInstance(String baseUrl) {
            url = baseUrl;
            if (retrofit == null) {
                return create();
            } else {
                return retrofit;
            }
        }
    
        private static Retrofit create() {
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            // log用拦截器
            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            // 开发模式记录整个body,否则只记录基本信息如返回200,http协议版本等
            if (BuildConfig.DEBUG) {
                loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            } else {
                loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
            }
    
            //设置缓存目录
            File cacheFile = new File(RetrofitApplication.getContext().getExternalCacheDir(), CACHE_NAME);
            //生成缓存,50M
            Cache cache = new Cache(cacheFile, 1024 * 1024 * 50);
            //缓存拦截器
            Interceptor cacheInterceptor = new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request();
                    //网络不可用
                    if (!NetworkUtils.isAvailable(RetrofitApplication.getContext())) {
                        //在请求头中加入:强制使用缓存,不访问网络
                        request = request.newBuilder()
                                .cacheControl(CacheControl.FORCE_CACHE)
                                .build();
                    }
                    Response response = chain.proceed(request);
                    //网络可用
                    if (NetworkUtils.isAvailable(RetrofitApplication.getContext())) {
                        int maxAge = 0;
                        // 有网络时 在响应头中加入:设置缓存超时时间0个小时
                        response.newBuilder()
                                .header("Cache-Control", "public, max-age=" + maxAge)
                                .removeHeader("pragma")
                                .build();
                    } else {
                        // 无网络时,在响应头中加入:设置超时为4周
                        int maxStale = 60 * 60 * 24 * 28;
                        response.newBuilder()
                                .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                                .removeHeader("pragma")
                                .build();
                    }
                    return response;
                }
            };
            builder.addInterceptor(loggingInterceptor)
            .addInterceptor(cacheInterceptor)
            .cache(cache)
            .connectTimeout(15, TimeUnit.SECONDS)//设置超时
            .readTimeout(20, TimeUnit.SECONDS)
            .writeTimeout(20, TimeUnit.SECONDS)
            .retryOnConnectionFailure(true);//错误重连
            OkHttpClient client = builder.build();
            retrofit = new Retrofit.Builder()
                    .baseUrl(url)
                    //设置 Json 转换器
                    .addConverterFactory(GsonConverterFactory.create())
                    //RxJava 适配器
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .client(client)
                    .build();
            return retrofit;
        }
    }
    

    相关文章

      网友评论

          本文标题:Retrofit网络请求基本配置

          本文链接:https://www.haomeiwen.com/subject/jcjsfxtx.html