RxJava+Retrofit+OkHttp,一步一步封装网络框架;
使用RxJava+Retrofit+OkHttp,首先在build.gradle添加:
compile 'com.squareup.okhttp3:okhttp:3.8.1'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile "io.reactivex.rxjava2:rxjava:2.1.2"
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'com.orhanobut:logger:2.2.0'
compile "com.squareup.okhttp3:logging-interceptor:3.8.1"
一、Retrofit网络库的使用;
1、创建retrofit的实例:
Retrofit retrofit= new Retrofit.Builder()
.baseUrl("https://movie.douban.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
2、创建一个接口,里面放的是网络请求的Url;
public interface DouBanApi {
// http://api.douban.com/v2/movie/top250?start=25&count=25
@GET("v2/movie/top250")
Call<JsonObject> getcTop250(@Query("start") int start, @Query("count") int count);
}
3、使用retrofit请求网络:
DouBanApi urlAPI = retrofit.create(DouBanApi.class);
urlAPI.getcTop250(0,20).enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
}
@Override
public void onFailure(Call<JsonObject> call, Throwable t) {
}
});
它这个请求完成后,自动把请求的结果转换成了Json数据;请求的结果太多了我就不写了;
二、Retrofit配合RxJava使用;
1、接口中的Api返回类型我们给它改为RxJava的被观察者;
public interface DouBanApi {
// http://api.douban.com/v2/movie/top250?start=25&count=25
@GET("v2/movie/top250")
Observable<JsonObject> getTop250(@Query("start") int start,@Query("count") int count);
}
2、Retrofit+RxJava请求网络:
private void RxjavaandRetrofit(){
new Retrofit.Builder()
.baseUrl("https://movie.douban.com")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
.create(DouBanApi.class)
.getTop250(0,20)
.subscribeOn(Schedulers.io()) //被观察者 开子线程请求网络
.observeOn(AndroidSchedulers.mainThread()) //观察者 切换到主线程
.subscribe(new Observer<JsonObject>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(JsonObject jsonObject) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
这样就完成了RxJava+Retrofit请求网络;
三:添加OkHttp配置;
okhttp可以设置很多的东西,请求头、拦截器、Log打印、请求超时时间......(最主要的okhttp的速度比Retrofit快很多);
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30,TimeUnit.SECONDS)
.writeTimeout(30,TimeUnit.SECONDS)
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder request = chain.request().newBuilder();
request.addHeader("Accept","*/*");
//添加拦截器
return chain.proceed(request.build());
}
});
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Logger.i(message);
}
}).setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(loggingInterceptor);
Retrofit.Builder retrofit= new Retrofit.Builder()
.baseUrl("https://movie.douban.com")
.addConverterFactory(GsonConverterFactory.create());
retrofit.client(builder.build()).build();
这样Retrofit的网络请求就会使用OkHttp的内核了;
四、RxJava+Retrofit+OkHttp封装;
作为一个聪明的程序猿,不!作为一个聪明的攻城狮,我们每次请求不可能都写这么多的代码;来封装一下:
public class RetrofitUtils {
/*
http://api.douban.com/
*/
private String baseUrl = "http://api.douban.com/";
private static final RetrofitUtils retrofitUtils = new RetrofitUtils();
public static RetrofitUtils get(){
return retrofitUtils;
}
private static volatile Retrofit retrofit;
public RetrofitUtils(){
Retrofit.Builder retrofitBuilder = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()));
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30,TimeUnit.SECONDS)
.writeTimeout(30,TimeUnit.SECONDS)
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder request = chain.request().newBuilder();
request.addHeader("Accept","*/*");
//添加拦截器
return chain.proceed(request.build());
}
});
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Logger.i(message);
}
}).setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(loggingInterceptor);
retrofit = retrofitBuilder.client(builder.build()).build();
}
public static <T> T create(Class<T> cls) {
return retrofit.create(cls);
}
}
如何使用呢?
private void doubanTest() {
RetrofitUtils.get().create(DouBanApi.class)
.getTop250(0,5)
.subscribe(new Consumer<JsonObject>() {
@Override
public void accept(JsonObject jsonObject) throws Exception {
//正常请求成功
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
//请求异常时
}
});
}
简单不简单,还有谁!!!
其实,我们可以发现,RxJava+Retrofit+OkHttp它们3个的配合使用:
RxJava主要是用来实现线程的切换的。我们可以在指定订阅的在哪个线程,观察在哪个线程。我们可以通过操作符进行数据变换。整个过程都是链式的,简化逻辑;
Retrofit就是网络请求的一个架子,用它设置一些参数和请求的URL之类的;
OkHttp是网络请求的内核,实际的网络请求是它发出来的;
RxJava+Retrofit+OkHttp,一步一步封装网络框架;的更多相关文章
- 学习RxJava+Retrofit+OkHttp+MVP的网络请求使用
公司的大佬用的是这一套,那我这个菜鸟肯定要学习使用了. 我在网上找了很多文章,写的都很详细,比如 https://www.jianshu.com/u/5fd2523645da https://www. ...
- Retrofit 2.0基于OKHttp更高效更快的网络框架 以及自定义转换器
时间关系,本文就 Retrofit 2.0的简单使用 做讲解 至于原理以后有空再去分析 项目全面.简单.易懂 地址: 关于Retrofit 2.0的简单使用如下: https://gitee.c ...
- Retrofit + RxJava + OkHttp 让网络请求变的简单-基础篇
https://www.jianshu.com/p/5bc866b9cbb9 最近因为手头上的工作做完了,比较闲,想着做一些优化.看到以前用的那一套网络框架添加一个请求比较麻烦,并且比较难用,所以想改 ...
- 结合Retrofit,RxJava,Okhttp,FastJson的网络框架RRO
Retrofit以其灵活的调用形式, 强大的扩展性著称. 随着RxAndroid的推出, Retrofit这样的可插拔式的网络框架因其可以灵活兼容各种数据解析器, 回调形式(主要还是RxJava啦)而 ...
- Android RxJava+Retrofit完美封装
作者简介 本篇来自 小河马 的投稿,分享了自己是如何进行 RxJava+Retrofit 的封装.本文的技术点自然没话说,另外对于这种模块化的思路,希望能帮助到大家.最后提前祝大家周末愉快以及圣诞快乐 ...
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
前言: 通过上面的学习,我们不难发现单纯使用okHttp来作为网络库还是多多少少有那么一点点不太方便,而且还需自己来管理接口,对于接口的使用的是哪种请求方式也不能一目了然,出于这个目的接下来学习一下R ...
- Android网络框架之Retrofit + RxJava + OkHttp 变化的时代
1.什么是Retrofit框架? 它是Square公司开发的现在非常流行的网络框架,所以我们在导入它的包的时候都可以看到这个公司的名字,目前的版本是2. 特点: 性能好,处理快,使用简单,Retrof ...
- retrofit okhttp RxJava bk Gson Lambda 综合示例【配置】
项目地址:https://github.com/baiqiantao/retrofit2_okhttp3_RxJava_butterknife.git <uses-permission andr ...
随机推荐
- 20165308 实验二 Java面向对象程序设计
20165308 实验二 Java面向对象程序设计 实验二 Java面向对象程序设计 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:张士洋 学号:20165308 指导教师:娄嘉鹏 ...
- python 通过pymongo操作mongoDB执行sort
在mongo shell 中对数据进行排序操作的时候 db.getCollection('ANJUKE_PRICE').find({},{'id':1,'_id':0}).sort({'id':1}) ...
- C++ Builder使用VC DLL
好久没用BCB了,真的有些陌生了,当然个烂笔头吧. 1 先 implib c:\xxx.lib c:\xxx.dll 生成lib文件 2 #pragma comment(lib,"xxx.l ...
- Flume 高可用配置案例+load balance负载均衡+ 案例:日志的采集及汇总
高可用配置案例 (一).failover故障转移 在完成单点的Flume NG搭建后,下面我们搭建一个高可用的Flume NG集群,架构图如下所示: (1)节点分配 Flume的Agent和Colle ...
- mysql、MS SQL关于分页的sql查询语句 limit 和row_number() OVER函数
在做项目的时候需要些分页,用的数据库是MySQL,之前看到的参考例子是用MS SQL做的,在MS SQL.Oracle里面有ROW_NUMBER() OVER函数可以在数据库里对数据进行分组.百度后的 ...
- C#中winform使用相对路径读取文件的方法
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73b6cd0d3027fa3cf1fd579080101 ...
- 《JavaScript设计模式与开发》笔记 4.闭包
1.变量的作用域 2.变量的生存周期 3.闭包更多作用 1.封装变量 2.延续局部变量寿命 4.闭包和面向对象设计 5.闭包和内存管理 1.变量的作用域 var func = function(){ ...
- 【转】[Android] NDK独立编译——独立工具链
转载地址:https://blog.csdn.net/suningning/article/details/74510125
- java容器Container和组件Component之GUI
GUI全称Graphical User Interfaces,意为图形用户户界面,又称为图形用户接口,GUI指的就是采用图形方式显示的计算机操作用户界面,打个比方吧,我们点击QQ图标,就会弹出一个QQ ...
- nodeJS安装及npm设置淘宝镜像
node.js安装 下载node.js安装包:https://nodejs.org/en/download/,下载相应版本的node.js. 需注意,在window中,node的安装目录中,最好不要有 ...