【网络】Retrofit 2.0 初步接触 跨越坑去学习

Retrofit 学习笔记:
基于网址:
Retrofit 2.0:有史以来最大的改进
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0915/3460.html
RxJava 与 Retrofit 结合的最佳实践
http://gank.io/post/56e80c2c677659311bed9841
做的相关摘记总结

一、 Retrofit 简单使用

怎么使用POST 和GET
Retrofit请求参数注解字段说明:
http://www.loongwind.com/archives/242.html

二、Retrofit2 和OkHttpClient3

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:

  • 1、 添加依赖
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
  • 2、 定义方式
    public interface APIService {
        @POST("/list")
       Call loadRepo();
    }

这里返回的是一个call对象,如果要取消正在进行中的业务,call.cancle();

  • 3、 使用方式
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://api.nuuneoi.com/base/")
            .build();
    service = retrofit.create(APIService.class);

同步:

    service.loadRepo().execute();

异步:

    srvice.loadRepo().enqueue();
  • 4、 接收json 并解析成DAO ,添加Gson Converter依赖(因为2.0 不再提供)
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    retrofit....
                .addConverterFactory(GsonConverterFactory);

其中也可以使用自定义Gson对象

    .addConverterFactory(GsonConverterFactory.create(gson))
  • 5、 添加RxJava

添加依赖:

    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 会帮我们进行处理。

但是
这里有一个很大的误区,这里的取消请求并不能真正的取消,只有在请求未发出之前才是有效的,如果数据已经到达服务端,这个时候取消了请求,就会造成数据不一致的情况了。在网络正常的情况下,用户的操作速度肯定比不了代码的执行速度,所以说是获取数据的话,取消请求还是可以的,提交数据的话数据的一致性就不能保证了。
-不只是取消订阅,而是断开网络连接
摘自上述网址中的评论

  • 6、最后来一个小例子
    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 不要以/开头

2、 Okhttp3:

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,可以操作很多数据(例如,获取响应头和设置响应头)。

你可能感兴趣的:(android)