Retrofit 学习笔记:
基于网址:
Retrofit 2.0:有史以来最大的改进
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0915/3460.html
RxJava 与 Retrofit 结合的最佳实践
http://gank.io/post/56e80c2c677659311bed9841
做的相关摘记总结
怎么使用POST 和GET
Retrofit请求参数注解字段说明:
http://www.loongwind.com/archives/242.html
Retrofit 在2.0 之后做了很大的改进,移除了很多之前版本的功能,单独使用Retrofit,功能就比较限制了。怎么设置网络访问时间,超时连接的时间限制?以及怎么设置拦截器?这样的功能就借助于OkHttpClient一起使用。
Retrofit本身有一个自带的OkHttpClient,每个Retrofit版本可能对应了不同版本的okhttp,当你发现你的类里面没有某个方法的时候,一般就是你找的资料和你使用的配置匹配。
这里将遇到的坑,做下记录:
1)、由于之前使用的是
com.squareup.retrofit:retrofit:2.0.0-beta2
这个版本的Retrofit 对应的是okhttp2,在网上查找相关资料的时候就发现,为什么我的类里面没有某些方法呢?期间,各种纠结。
compile 'com.squareup.retrofit2:retrofit:2.1.0'
对应okhttp3
okhttp3和okhttp2的区别:
http://www.wtoutiao.com/p/1c8QxRG.html
—Retrofit2.0 的升级 ,应该是指,retrofit—-retrofit2的过程,看上面引入的retrofit的包的差别
2)、在Retrofit2.0 中默认情况下,已经引入了okhttp。简单来说就是,在你的项目中只要引入了Retrofit,不用自己引入okhttp就能使用okhttp的功能了。
Retrofit 和okhttp各司其职,okhttp设置之后,Retrofit添加client即可。
1、Retrofit 2.0:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
public interface APIService {
@POST("/list")
Call loadRepo();
}
这里返回的是一个call对象,如果要取消正在进行中的业务,call.cancle();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.nuuneoi.com/base/")
.build();
service = retrofit.create(APIService.class);
同步:
service.loadRepo().execute();
异步:
srvice.loadRepo().enqueue();
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
retrofit....
.addConverterFactory(GsonConverterFactory);
其中也可以使用自定义Gson对象
.addConverterFactory(GsonConverterFactory.create(gson))
添加依赖:
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'
使用:
除了使用Call模式来定义接口,我们也可以自己定义type,这个机制叫做CallAdapter, Retrofit团队有已经准备好了的CallAdapter module。其中最著名的module可能是为RxJava准备的CallAdapter,它将作为Observable返回.
Retrofit.....
.addCallAdapterFactory(RxJavaCallAdapterFactory.create());
作为Observable返回:
Observable observable = service.loadDessertListRx();
得到一个observable 对象,现在就可以使用RxJava 进行操作了。
使用RxJava 返回的是一个Observable对象,那么,怎么取消正在执行的业务(不使用RxJava的时候采用的是Call.cancle();)
解决方案:对象的订阅解除绑定的时候,subscriber会调用Subscription的unsubscribe方法,然后触发创建Subscription时候的传递进来的Action0的call方法。RxJavaCallAdapterFactory帮我们给subscriber添加的是call.cancel()。
意思是,只要解除订阅就好了,Retrofit 会帮我们进行处理。
但是
这里有一个很大的误区,这里的取消请求并不能真正的取消,只有在请求未发出之前才是有效的,如果数据已经到达服务端,这个时候取消了请求,就会造成数据不一致的情况了。在网络正常的情况下,用户的操作速度肯定比不了代码的执行速度,所以说是获取数据的话,取消请求还是可以的,提交数据的话数据的一致性就不能保证了。
-不只是取消订阅,而是断开网络连接
摘自上述网址中的评论
public interface APIService {
@POST("user/list")
Call loadUsers();
@POST("user/obs")
Observable loadObs();
}
public void doSomething() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.nuuneoi.com/base/")
.addConverterFactory(GsonConverterFactory.create())
.build();
APIService service = retrofit.create(APIService.class);
Call call = service.loadUsers();
....
Observable observable = Service.loadObs();
....
}
完整的网络访问请求地址:http:/ /api.nuuneoi.com/base/user/list
注意:baseUrl 最好以/结尾,@url 不要以/开头
Retrofit2.0 中自动设置了okhttp的依赖。
设置时间(ReadTimeout,ConnectTimeout)、设置拦截器(Retrofit2.0 移除了这部分,所有需要在okhttp里面设置)
okhttp3 很多设置都放到了builder里面,和okhttp2有一定的区别
//设置超时 和拦截器
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
.connectTimeout(CONN_TIMEOUT, TimeUnit.SECONDS)
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
//重要的两个方法 获取request和response
Request resuest=chain.request();
Response response = chain.proceed(request);
//其他操作
return response;
}
})
.build();
Retrofit 的okHttpClient这里涉及到了request和response,可以操作很多数据(例如,获取响应头和设置响应头)。