Retrofit – 让你的网络请求更简单
Retrofit 、RxJava以及OkHttp 都是最近非常火的开源框架,通过Retrofit 、RxJava以及OkHttp的结合,可以非常便捷地实现网络请求。但是在使用之前,我们经常需要对Retrofit进行少量基础配置,来实现更好的网络请求,比方设置 Json 转换器、RxJava 适配器、设置 Debug Log 模式、设置超时、错误重连,以及配置缓存等等少量内容。今天就主要分享一下这方面的内容。
引入依赖
//引入okhttp compile 'com.squareup.okhttp3:okhttp:3.5.0' //引入retrofit compile 'com.squareup.retrofit2:retrofit:2.1.0' //引入rxjava compile 'io.reactivex.rxjava2:rxjava:2.0.4' //引入Log阻拦器,方便DEBUG模式输出log信息 compile 'com.squareup.okhttp3:logging-interceptor:3.5.0' //引入rxjava适配器,方便rxjava与retrofit的结合 compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' //引入json转换器,方便将返回的数据转换为json格式 compile 'com.squareup.retrofit2:converter-gson:2.1.0' //引入rxandroid compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
从引入的依赖便可看出本篇文章以常用的少量网络请求为例。采用RxJava和Retroifit结合的方式,返回的数据json格式。
下面开始一步步配置Retrofit常用的网络请求配置。
Log信息阻拦器
// log用阻拦器 HttpLoggingInterceptor loggingInterceptor= new HttpLoggingInterceptor(); // 开发模式记录整个body,否则只记录基本信息如返回200,http协议版本等 if (BuildConfig.DEBUG) { loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); } else { loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC); }
HttpLoggingInterceptor 是一个阻拦器,用于输出网络请求和结果的 Log,可以配置 level 为 BASIC / HEADERS / BODY。通过Log信息阻拦器方便我们进行调试,验证网络请求结果。
OkHttpClient.Builder builder= new OkHttpClient.Builder(); builder.addInterceptor(loggingInterceptor);
向okhttp中增加阻拦器。阻拦器的功能很强大。
缓存机制
无网络时,也能显示数据
//设置缓存目录 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) .build(); } else { // 无网络时,在响应头中加入:设置超时为4周 int maxStale = 60 * 60 * 24 * 28; response.newBuilder() .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) .build(); } return response; } };
当网络不可用的时候,强制使用缓存。当网络可用的时候,直接访问网络,即把缓存中内容的期限设置为0。这样浏览器直接认为缓存过期,走网络访问途径。当网络不可用的时候,把缓存中内容的期限设置为4周,即4周内只需进行访问,都认为数据有效。
Cache-control 是由服务器返回的 Response 中增加的头信息,它的目的是告诉用户端是要从本地读取缓存还是直接从服务器摘取消息。它有不同的值,每一个值有不同的作用。
超时、重连
超时需重连
//设置超时 builder.connectTimeout(15, TimeUnit.SECONDS); builder.readTimeout(20, TimeUnit.SECONDS); builder.writeTimeout(20, TimeUnit.SECONDS); //错误重连 builder.retryOnConnectionFailure(true);
设置Retrofit
retrofit = new Retrofit.Builder() .baseUrl(url) //设置 Json 转换器 .addConverterFactory(GsonConverterFactory.create()) //RxJava 适配器 .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(client) .build();
至此,便完成了Retrofit配置的简单配置,以上配置仅仅满足常用的网络请求。假如有其余要求,可以在此基础上进行修改。
下面是以上配置的一律代码的地址,并进行了简单的封装,感兴趣的可以下载。
代码地址
自己是从事了七年开发的Android工程师,不少人私下问我,2019年Android进阶该怎样学,方法有没有?
没错,年初我花了一个多月的时间整理出来的学习资料,希望能帮助那些想进阶提升Android开发,却又不知道怎样进阶学习的朋友。【包括高级UI、性能优化、架构师课程、NDK、Kotlin、混合式开发(ReactNative+Weex)、Flutter等架构技术资料】,希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
资料获取方式:加入Android架构交流QQ群聊:513088520 ,进群即领取资料!!!
点击链接加入群聊【Android移动架构总群】:加入群聊
资料大全
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Retrofit – 让你的网络请求更简单