一步步结合实例学习retrofit2
来源:互联网 发布:美工自学多久能自己做 编辑:程序博客网 时间:2024/06/03 03:22
retrofit实际上就是对gson和okhttp进行了结合封装。一般来说,我们需要发送网络请求,然后处理返回的数据。而通过retrofit,可以快速简洁的完成这一系列操作,一般还要结合RxJava,让整个过程更加优雅。
准备工作:
compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0'在gradle中加入这两个库,第二个用于将相应数据转换成我们需要的数据类型。converter(转换器)
推荐使用插件GsonFormat,建立数据模型类文件后使用快捷键alt+s,将json字符串输入就可以快速生成相应的json数据类。
1.最简单的网络访问:
首先来回顾一下如何使用okhttp进行一次网络访问:
Request request=new Request.Builder() .url(url) .build(); Call call=client.newCall(request);//将请求封装成任务 call.enqueue...需要新建request,然后使用onHttpClient和request生成Call,然后执行这个Call的任务。基本上每次网络访问都要重复这个过程,当然,我们可以自己把这个封装一下。
接下来看看retrofit封装后如何进行网络访问:
首先新建一个接口,然后在接口里定义方法,以后所有的网络请求方法也都放在这个接口里:
@GET("course/courseRelease_list") Call<ResponceBody> getCourse();这里的注解明显就是指定访问方式了,括号里的参数要结合BaseUrl生成完整的Url。可以发现,这里的Call类具有了泛型。这个类型的意义我们暂时不去考虑,就使用这个ResponceBody。
然后就开始使用了:
Retrofit retrofit=new Retrofit.Builder() .baseUrl(BASE_URL) .build(); AppUrl appUrl=retrofit.create(AppUrl.class); Call<ResponseBody> call=appUrl.getCourse2(3,1); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { } });首先使用BaseUrl实例化Retrofit对象,BaseUrl其实就是URL前面那段不变的部分,他和上面GET后面的url拼接成最后的url。然后使用这个对象实例化接口,调用接口方法生成Call对象。
到这一步,接下来就和okhttp差不多了,进行同步或异步执行,异步时写回调接口。
onResponse中获得的response.body这里是一个ResponseBody对象。
2.请求拼接部分API:
(1)使用GET与POST指定访问方式,后面的参数拼接在BaseUrl后。
(2)使用Path替换掉URL中的动态部分:
@GET("{name}") Call<ResponceBody> get(@Path("name") String urlName);这里方法传入的参数urlName就会替换掉Url中花括号里的name,注解后面的参数与替换名保持一致,但是不能用这个来发送参数,发送参数可以用Query
(3)使用Query为GET添加参数:
@GET("course/courseRelease_list") Call<TestBean> getCourse2(@Query("pageIndex") int pageIndex, @Query("courseType") int courseType);注解后面的参数表示key,传入的是value。
(4)使用FormUrlEncoded和Field提交表单:
要提交表单就给方法加上@FormUrlEncoded注解,Field的使用方式和Query一样:
@FormUrlEncoded@POST("user/login")Call<User> updateUser(@Field("username") String name, @Field("password") String pass);(5)使用Body在请求体中添加json:
@POST("aaa") Call<MBean> send( @Body UserInfo body);可以直接传对象,借助底层的gson可以完成对象和json的简单转化。
3.自动转换器:
至此还无法看出retrofit的强大之处,其一大优势在于简单的把返回的数据直接转换成我们制定的类型。
首先要为retrofit对象添加转换器:
Retrofit retrofit=new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build();
把接口中方法的泛型改成我们需要的数据类型,然后这样使用:
call.enqueue(new Callback<TestBean>() { @Override public void onResponse(Call<TestBean> call, Response<TestBean> response) { TestBean bean=response.body(); }
可以看到,response.body直接返回了一个我们需要的类型的对象,retrofit帮我们进行了转换。
虽然我们都知道这是gson的强大,但是挺神奇的。
转换数组:
Type listType = new TypeToken<List<PostItem>>() {}.getType(); List<PostItem> list1 = new Gson().fromJson(item.getContent(), listType);
开发中遇到的一个问题是,如果对象的一个字段是一个json对象或数组,那么就不能将其转换成字符串。
4.与RxJava结合使用:
retrofit提供了与rxjava完美结合的方法:接口中的方法可以直接返回被观察者。
首先要添加和rxjava有关的转换器:
Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://www.BaseURL.com/") .addConverterFactory(GsonConverterFactory.create())//自动通过Gson转josn,上面有提到 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//添加RxJava支持 .build();然后定义方法:
@GET("aaa") Observable<MBean> get();
泛型还是需要的结果数据类型。
url.get() .subscribeOn(Schedulers.io()) .subscribe(new Subscriber<MBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(MBean mBean) { } });
使用起来非常方便,可以发现,被观察者调用观察者方法发送数据的过程也被封装了,简直666.
- 一步步结合实例学习retrofit2
- Retrofit2.0的学习以及Rxjava与Retrofit2的结合使用
- 学习 Retrofit2
- retrofit2+rxjava的结合使用
- Retrofit2简单实例
- Android框架学习之Retrofit(二)RxJava和Retrofit2.0的结合使用
- RxJava和Retrofit2.0的结合使用
- rxandroid结合retrofit2发送post请求
- Android-->Rxjava与Retrofit2的结合实战
- Retrofit2 结合 Rxjava 解决返回的 JSON
- rxjava2 结合retrofit2进行业务封装
- MVP结合RxJava,Retrofit2.0初探索
- Retrofit2.0与RXJava2.0最新结合:
- Android Retrofit2和Kotlin结合上传文件
- Retrofit2的学习笔记
- Retrofit2.1.0 学习笔记
- Retrofit2.0学习
- retrofit2学习笔记
- 读过的优秀博客
- 普通人如何突破贫穷的层级,成为人上之人
- java单例模式案例,及单例体现的关键
- java实现基于SM4算法计算联机MAC数据
- 散列表(哈希表)
- 一步步结合实例学习retrofit2
- 无约束非线性优化经典算法学习笔记
- LeetCode Weekly Contest 40(3)
- WUST 1945 局域网(最小生成树入门+克鲁斯卡尔算法)
- 浅析安卓事件分发机制源码
- 用eclipse在HADOOP中的一些系统指令操作
- 不能摆脱别人的标准,再大的成就也总有遗憾
- Vmware12安装Centos7 minimal 无法在桥接模式下上网
- Spring及Spring MVC总结