美文网首页
网络管理类

网络管理类

作者: 我家猫猫不睡觉 | 来源:发表于2020-08-07 10:05 被阅读0次
    public class NetworkManager {
    
        //需要在application里初始化
       private static NetworkManager mInstance;
        private static Retrofit retrofit;
        private static volatile RequestApi request = null;
    
        public static NetworkManager getInstance() {
            if (mInstance == null) {
                synchronized (NetworkManager.class) {
                    if (mInstance == null) {
                        mInstance = new NetworkManager();
                    }
                }
            }
            return mInstance;
        }
    
         /**
         * 初始化必要对象和参数
         */
        public void init() {
            //声明缓存地址和大小
            Cache cache = new Cache(context.getCacheDir(),2 * 1024 * 1024);
            // 初始化okhttp
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            if(BuildConfig.DEBUG) {
                HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
                logging.setLevel(HttpLoggingInterceptor.Level.BODY);
                builder.addInterceptor(logging);
            }
    
             builder.cache(cache)
                    .retryOnConnectionFailure(true) // //默认重试一次,若需要重试N次,则要实现拦截器
                    .addInterceptor(new Interceptor() {
                        @Override
                        public Response intercept(Chain chain) throws IOException {
                              // 有网络的情况下,缓存时间是:20秒。也就是在20秒内的请求都是获取本地的缓存。当网络断开后,会设置一个离线的缓存,为上面设置的时间
                            // maxAge :设置最大失效时间,失效则不使用
                            // maxStale :设置最大失效时间,失效则不使用
                            // max-stale在请求头设置有效,在响应头设置无效。
                            // max-stale和max-age同时设置的时候,缓存失效的时间按最长的算
                            Request request = chain.request();
                            if (!isNetworkReachable(context)) {
                                int maxStale = 7 * 24 * 60 * 60; // 离线时缓存保存1周,单位:秒
                                CacheControl tempCacheControl = new CacheControl.Builder()
                                        .onlyIfCached()
                                        .maxStale(maxStale, TimeUnit.SECONDS)
                                        .build();
                                request = request.newBuilder()
                                        .cacheControl(tempCacheControl)
                                        .build();
                            }
                            return chain.proceed(request);
                        }
                    })
                    .addNetworkInterceptor(new Interceptor() {
                        @Override
                        public Response intercept(Chain chain) throws IOException {
                            Request request = chain.request();
                            Response originalResponse = chain.proceed(request);
                            int maxAge = 20;    // 在线缓存,单位:秒
                            return originalResponse.newBuilder()
                                    .removeHeader("Pragma")// 清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效
                                    .removeHeader("Cache-Control")
                                    .header("Cache-Control", "public, max-age=" + maxAge)
                                    .build();
                        }
                    })
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .readTimeout(20, TimeUnit.SECONDS)
                    .writeTimeout(20, TimeUnit.SECONDS);
    
            OkHttpClient client = builder.build();
          
            // 初始化Retrofit
            retrofit = new Retrofit.Builder()
                    .client(client)
                    .baseUrl(BuildConfig.URL) // 设置基础地址 url
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 设置返回类型适配
                    .addConverterFactory(GsonConverterFactory.create()) // 设置数据解析器
                    .build();
        }
    
         /**
         * create you ApiService
         * Create an implementation of the API endpoints defined by the {@code service} interface.
         */
        public <T> T create(final Class<T> service) {
            if (service == null) {
                throw new RuntimeException("Api service is null!");
            }
            return retrofit.create(service);
        }
    
     /**
         * 网络是否连接
         *
         * @param context
         * @return
         */
        private boolean isNetworkReachable(Context context) {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
            @SuppressLint("MissingPermission") NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isConnected()) {
                // 网络连接
                return true;
            }
            return false;
        }
    }
    

    *一:基类
    https://www.jianshu.com/p/afa7294d5a56

    *二:IView + IPresenter + 响应体泛型 + presenter 弱引用持有
    https://www.jianshu.com/p/22e38f6aac40

    *三:接口文档
    https://www.jianshu.com/p/6401f0c4d5c0

    *四:案例
    https://www.jianshu.com/p/9a96007db24c

    *推荐

    Android Retrofit2.0使用详解
    https://blog.csdn.net/qq_35229022/article/details/93849660

    RxJava入门
    https://www.jianshu.com/p/a406b94f3188

    相关文章

      网友评论

          本文标题:网络管理类

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