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 ...
随机推荐
- maven的profile
https://elim.iteye.com/blog/1900568 简介:配置不同环境要使用的profile,再idea操作画面可以选
- VC++6 调用teststand api的方法
参考example中的vs2010的例子,创建MFC工程 打开project->setting ,c/c++ tab cat 选 Proprocessor ->Additional in ...
- 深入解析 ext2 文件系统 (转)
http://blog.chinaunix.net/uid-24774106-id-3266816.html 很久以来,就想写一篇关于ext 家族文件系统的文章,源于我刚工作的时候,曾经一不小心rm ...
- 使用Jmeter创建ActiveMQ JMS POINT TO POINT请求,环境搭建、请求创建、插件安装、监听服务器资源等
转自:http://www.cnblogs.com/qianyiliushang/p/4348584.html 准备工作: 安装JDK,推荐使用1.7以上版本,并设置JAVA_HOME 下载Jmete ...
- [转]TA-Lib 安装
转自:https://mrjbq7.github.io/ta-lib/install.html Installation You can install from PyPI: $ pip instal ...
- centos中nodejs npm安装cordova
1.安装cordova npm install -g cordova --registry https://registry.npm.taobao.orgnpm install -g ionic -- ...
- Vim NerdTree
参考链接:http://yang3wei.github.io/blog/2013/01/29/nerdtree-kuai-jie-jian-ji-lu/ 切换工作台和目录 ctrl + w + h 光 ...
- InfluxDB 常用命令
查表: http://192.168.0.200:8086/query?q=select+*+from+telegraf..cpu http://192.168.0.200:8086/query?q= ...
- Azure SQL 数据库仓库Data Warehouse (3) DWU
<Windows Azure Platform 系列文章目录> 在笔者的上一篇文章中:Azure SQL 数据库仓库Data Warehouse (2) 架构 介绍了SQL DW的工作节点 ...
- eclipse基于git上传项目到码云上
此文章只讲如何把项目上传到码云上面,前提是你的项目已经用git创建好了. 关于如何用git创建项目,请读者见我博客的另一篇文章. 继续:右键点击ssm [ssm master]项目-->选择Te ...