//ok依赖 implementation 'com.squareup.okhttp3:okhttp:3.2.0' //ok 日志的拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:3.12.0' //retrofit+RXjava implementation 'com.squareup.retrofit2:retrofit:2.3.0'//导入retrofit implementation 'com.google.code.gson:gson:2.6.2'//Gson 库 implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' implementation 'io.reactivex.rxjava2:rxjava:2.x.y' implementation 'com.squareup.retrofit2:converter-gson:2.3.0'//转换器,请求结果转换成//Model implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'//配合Rxjava 使用
依赖引入完成之后我们就可以进行我们的Retrofit+OkHttp的二次封装
public class NetUtils { String url="";//这里是域名 private ApiService apiService; public NetUtils(){ initModel(); } private static class Coallack{ private static final NetUtils NET_UTILS=new NetUtils(); } public static NetUtils getInstance(){ return Coallack.NET_UTILS; } private void initModel() { HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient builder = new OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .addNetworkInterceptor(httpLoggingInterceptor) .addNetworkInterceptor(new MyHead())//添加请求头 如果后台给的不是请求头请求 完全可以删除这段代码 .build(); Retrofit build1 = new Retrofit.Builder() .baseUrl(url) .client(builder) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); apiService = build1.create(ApiService.class); //ApiService就是我们Retrofit接口 } //请求头 private class MyHead implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); //获取token String token=""; //token是用来存入本地的 所以看你怎么拿token信息 if(TextUtils.isEmpty(token)){ return chain.proceed(request); } Request build = request.newBuilder().addHeader("", "").build(); return chain.proceed(build); } } }
在这里强调一下 addInterceptor和addNetworkInterceptor的区别
addInterceptor添加应用拦截器 ● 不需要担心中间过程的响应,如重定向和重试. ● 总是只调用一次,即使HTTP响应是从缓存中获取. ● 观察应用程序的初衷. 不关心OkHttp注入的头信息如: If-None-Match. ● 允许短路而不调用 Chain.proceed(),即中止调用. ● 允许重试,使 Chain.proceed()调用多次. addNetworkInterceptor 添加网络拦截器 ● 能够操作中间过程的响应,如重定向和重试. ● 当网络短路而返回缓存响应时不被调用. ● 只观察在网络上传输的数据. ● 携带请求来访问连接. > 而我们使用addInterceptor这个时候呢我们的程序就不会崩溃但是我们的onNext中的log日志不打印 > 我们使用addNetworkInterceptor日志就会正常打印
为什么我们网络请求会使用静态内部类的方式呢
静态内部类的好处:是采用了类加载机制来保证创建一个instance实力它与饿汉模式一样,也是利用了类加载机制,因此不存在多线程并发的问题不一样的是,它是在内部类里面去创建对象实例。
这样的话,只要应用中不使用内部类,JVM就不会去加载这个单例类,也就不会创建单例对象,从而实现懒汉式的延迟加载。也就是说这种方式可以同时保证延迟加载和线程安全