Android从零开搞系列:网络框架系列(3)Retrofit+RxJava+MVP(上)Retrofit
2017-01-09 12:33
555 查看
转载请注意:http://blog.csdn.net/wjzj000/article/details/54287823
本菜开源的一个自己写的Demo,希望能给Androider们有所帮助,水平有限,见谅见谅…
https://github.com/zhiaixinyang/PersonalCollect (拆解GitHub上的优秀框架于一体,全部拆离不含任何额外的库导入)
https://github.com/zhiaixinyang/MyFirstApp(Retrofit+RxJava+MVP)
今天是微信小程序公测的一天,水平有限暂时就不对小程序做过多的评价,坐的业内大神开撕…
今天记录的内容是Retrofit+RxJava+MVP的梳理。之前一直没感觉到他们的强大之处,所以还是比较抵触。直到越来越感觉很难去维护自己写的代码,半个月再回来看自己的代码,真刺激…
所以对他们的记录就得搞起来….
之前写过一篇Retrofit的简单用法,比较水但也比较直接,感兴趣的看官可以瞅一瞅。
http://blog.csdn.net/wjzj000/article/details/52806822
先让我们,来一发Retrofit。
但从网络请求上来说,这些方案都是不错的选择。
但是我要考虑异步,要考虑耦合性,要考虑七大姑八大姨等等一系列问题!因此让我们感受未知的力量…
先看一下服务器的返回值:
很简单的一组数据,对应了三个键值对。这里的key要和我们的JavaBean一一对应。
[
{“name”:”齐天大圣”,”content”:”我要这铁棒有何用!”,”imgpath”:”http://120.27.4.196:8080/image/img1.png“},
{“name”:”吕布”,”content”:”人中吕布,马中赤兔!”,”imgpath”:”http://120.27.4.196:8080/image/img2.jpg“},
{“name”:”霍去病”,”content”:”犯我强汉者,虽远必诛!”,”imgpath”:”http://120.27.4.196:8080/image/img3.jpg“},
{“name”:”又帅又长的作者”,”content”:”妈的,智障。”,”imgpath”:”http://120.27.4.196:8080/image/img4.png“}
]
Retrofit最大的使用不同:
使用时要先创建一个!接口!
JavaBean如下,没啥好看,就是对应服务器Json的key:
请求的过程:
我们可以比较清晰的看出,整个的请求过程和OkHttp过程很类似。没错Retrofit的底层网络请求就是基于OkHttp在做。
在这里我们会发现,一套代码些下来,除了使用封装了Gson比较方便的解析了Json好像也没有太好用很多…
妈的,你咋不上天和神舟十一肩并肩!它就是一个网络请求框架,你还想要它怎样?怪它没能力跟随,你去的方向。你还要它怎样,要怎样,你突然来的短信就够它悲伤。
我们的题目是Retrofit+RxJava+MVP,我们把Retrofit和另外这俩货在一起使用的时候,我们才会感受到那快要压不住的棺材盖…
使用过程非常的简单:
效果如下:
@FormUrlEncoded注解:
@Part注解:
@Multipart注解:
如果还不是很清楚,可以参考鸿洋大神的博客:
http://blog.csdn.net/lmj623565791/article/details/51304204
最后希望各位看官可以star我的GitHub,三叩九拜,满地打滚求star:
https://github.com/zhiaixinyang/PersonalCollect
https://github.com/zhiaixinyang/MyFirstApp
本菜开源的一个自己写的Demo,希望能给Androider们有所帮助,水平有限,见谅见谅…
https://github.com/zhiaixinyang/PersonalCollect (拆解GitHub上的优秀框架于一体,全部拆离不含任何额外的库导入)
https://github.com/zhiaixinyang/MyFirstApp(Retrofit+RxJava+MVP)
写在前面
今天没人约也没人请吃饭,所以只能蹲在家里自己跟自己玩…今天是微信小程序公测的一天,水平有限暂时就不对小程序做过多的评价,坐的业内大神开撕…
今天记录的内容是Retrofit+RxJava+MVP的梳理。之前一直没感觉到他们的强大之处,所以还是比较抵触。直到越来越感觉很难去维护自己写的代码,半个月再回来看自己的代码,真刺激…
所以对他们的记录就得搞起来….
之前写过一篇Retrofit的简单用法,比较水但也比较直接,感兴趣的看官可以瞅一瞅。
http://blog.csdn.net/wjzj000/article/details/52806822
先让我们,来一发Retrofit。
Retrofit
简单来说它是一个网络请求框架。但从这一点上来说我们有很多可以选择的方案,比如:原生的HttpURLConnection,还有几年前谷歌推荐Volley…当然肯定还有其他大神写的格式各样的框架。但从网络请求上来说,这些方案都是不错的选择。
但是我要考虑异步,要考虑耦合性,要考虑七大姑八大姨等等一系列问题!因此让我们感受未知的力量…
结合Gson进行最简单的请求
一切的最开始肯定是Gradle配置://这是我们的Retrofit依赖 compile 'com.squareup.retrofit2:retrofit:2.1.0' //这个的作用是直接将Json返回值转成JavaBean compile 'com.squareup.retrofit2:converter-gson:2.1.0' //这个的作用是直接放回String类型的服务器返回值 compile 'com.squareup.retrofit2:converter-scalars:2.1.0' //当然还有很多其他的方式...不够用的时候百度一下,没毛病...
先看一下服务器的返回值:
很简单的一组数据,对应了三个键值对。这里的key要和我们的JavaBean一一对应。
[
{“name”:”齐天大圣”,”content”:”我要这铁棒有何用!”,”imgpath”:”http://120.27.4.196:8080/image/img1.png“},
{“name”:”吕布”,”content”:”人中吕布,马中赤兔!”,”imgpath”:”http://120.27.4.196:8080/image/img2.jpg“},
{“name”:”霍去病”,”content”:”犯我强汉者,虽远必诛!”,”imgpath”:”http://120.27.4.196:8080/image/img3.jpg“},
{“name”:”又帅又长的作者”,”content”:”妈的,智障。”,”imgpath”:”http://120.27.4.196:8080/image/img4.png“}
]
Retrofit最大的使用不同:
使用时要先创建一个!接口!
public interface RetrofitApi { //此URL就是我们需要访问的地址,注意结尾必须是/ String URL = "http://www.ohonor.xyz/strutstest/"; //GET注解标识用GET方法请求服务器 //这里的注解中的参数retrofit,会在真正使用的时候拼接在我们的URL上形成真正的访问服务器的URL。为什么要这样?简单来说这样我们就可以动态的去替换我们的URL了。 @GET("retrofit") //这里的Call对应OkHttp中的Call,RetrofitBean就是我们的JavaBean。泛型是一List也就是说我们从服务器取到的返回值是一个数组。 Call<List<RetrofitBean>> getRetrofitDatas(); }
JavaBean如下,没啥好看,就是对应服务器Json的key:
public class RetrofitBean { private String name; private String content; private String imgpath; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getImgpath() { return imgpath; } public void setImgpath(String imgpath) { this.imgpath = imgpath; } }
请求的过程:
Retrofit retrofit = new Retrofit.Builder() //此处必须要调用baseUrl传递一个URL .baseUrl(RetrofitApi.URL) //这里就是对应我们Gradle引入处理Json的库 .addConverterFactory(GsonConverterFactory.create()) .build(); RetrofitApi retrofitApi = retrofit.create(RetrofitApi.class); Call<List<RetrofitBean>> call = retrofitApi.getRetrofitDatas(); call.enqueue(new Callback<List<RetrofitBean>>(){ @Override public void onResponse(Call<List<RetrofitBean>> call, Response<List<RetrofitBean>> response){ //OK,在此我们通过response.body。就拿到了Gson帮我们解析好的List<RetrofitBean> } @Override public void onFailure(Call<List<RetrofitBean>> call, Throwable t){ //如果请求出错,这里将返回错误内容。比如:404,500之类的。 } });
我们可以比较清晰的看出,整个的请求过程和OkHttp过程很类似。没错Retrofit的底层网络请求就是基于OkHttp在做。
在这里我们会发现,一套代码些下来,除了使用封装了Gson比较方便的解析了Json好像也没有太好用很多…
妈的,你咋不上天和神舟十一肩并肩!它就是一个网络请求框架,你还想要它怎样?怪它没能力跟随,你去的方向。你还要它怎样,要怎样,你突然来的短信就够它悲伤。
我们的题目是Retrofit+RxJava+MVP,我们把Retrofit和另外这俩货在一起使用的时候,我们才会感受到那快要压不住的棺材盖…
当然现在先不谈,本篇就是搞Retrofit,做人要专一,不要搞事情…
POST相关
第一步肯定还是接口://这里注解使用POSTjiu @POST("retrofitPost") //下边会有介绍 @FormUrlEncoded /** * 此时我们需要往服务器POST数据,因此我们势必要传参 * 而Field注解就是以键值对方式传递的意思 * 当然还有其他方式,下文会一一展开 */ Call<String> postRetrofit(@Field("username") String suername, @Field("password") String password);
使用过程非常的简单:
//过程还是这个过程... Retrofit retrofit=new Retrofit.Builder() .baseUrl(RetrofitApi.URL) //唯一的不同就是ScalarsConverterFactory //它的效果是直接以String类型获取服务器返回值 .addConverterFactory(ScalarsConverterFactory.create()) .build(); RetrofitApi retrofitApi=retrofit.create(RetrofitApi.class); Call<String> call = retrofitApi.postRetrofit("abc","abc"); call.enqueue(new Callback<String>() { @Override public void onResponse(Call<String> call, final Response<String> response) { runOnUiThread(new Runnable() { @Override public void run() { tvContent.setText(response.body()); } }); } @Override public void onFailure(Call<String> call, Throwable t) { } });
效果如下:
部分注解解释:
@Field注解:表单编码请求的命名对。 简单示例: @FormUrlEncoded @POST(“/”) Call<ResponseBody>示例(@Field(“name”)字符串名称,@Field(“occupation”)字符串占用); 使用 {@code foo.example(“Bob Smith”,“President”)}调用会产生一个请求正文 {@code name = Bob + Smith&occupation = President}。
@FormUrlEncoded注解:
表示请求正文将使用表单URL编码。 字段(Field)应该声明为参数,并用{@Field}注释。 使用此注释发出的请求将具有{application / x-www-form-urlencoded} MIME类型。 字段名称和值将在根据URI编码之前进行UTF-8编码
www-form-urlencoded是POST数据默认编码格式,POST过去的key-value会被编码成QueryString. 格式如下: ?username=123&password=123
@Part注解:
表示多部分请求的单个部分。 此注释存在的参数类型将以下列三种方式之一进行处理: 如果类型是{okhttp3.MultipartBody.Part},内容将被直接使用。 从注释中省略名称(即{@Part MultipartBody.Part part})。 如果类型是{okhttp3.RequestBody RequestBody},则该值将直接与其内容类型一起使用。 在注释中提供Part名称(例如{@Part(“foo”)RequestBody foo})。 使用{plain Converter a converter}将其他对象类型转换为适当的表示形式。 在注释中提供Part名称(例如, {@Part(“foo”)Image photo})。 值可以是{null},它将从请求正文中省略它们。 @Multipart @POST(“/”) Call<ResponseBody> example(@Part(“description”)字符串描述, @Part(value =“image”,encoding =“8-bit”)RequestBody image); Part参数可能不是{null}。
@Multipart注解:
表示请求正文是多部分的。 Part应声明为参数并注释为{@Part}。
写在最后
关于Retrotfit的使用,暂时就整这么多,因为用法这种东西是死的,这里主要是为了记录各框架间的彼此协作,而不是它们每个人的具体用法…如果还不是很清楚,可以参考鸿洋大神的博客:
http://blog.csdn.net/lmj623565791/article/details/51304204
最后希望各位看官可以star我的GitHub,三叩九拜,满地打滚求star:
https://github.com/zhiaixinyang/PersonalCollect
https://github.com/zhiaixinyang/MyFirstApp
相关文章推荐
- Android从零开搞系列:网络框架系列(6)Retrofit+RxJava+MVP(下)MVP
- Android从零开搞系列:网络框架系列(5)Retrofit+RxJava+MVP(中-下)RxJava篇(下)
- Android从零开搞系列:网络框架系列(4)Retrofit+RxJava+MVP(中-上)RxJava篇(上)
- Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架
- Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架
- Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架
- [置顶] Android 一步步搭建MVP+Retrofit+RxJava网络请求框架
- Android 搭建MVP+Retrofit+RxJava网络请求框架
- Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架
- Android项目MVP模式框架+okhttp+rxjava+retrofit网络框架
- Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架
- Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架
- Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架
- Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架
- Android三大设计模式之一------------------MVP设计模式(包括rxjava+retrofit网络请求框架)
- Android 框架设计Demo,一个简单的MVP示例搜索功能,网络请求用Retrofit+RxJava实现
- Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架
- Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架
- 基于Retrofit+RxJava的Android分层网络请求框架
- RxAndroid+RxJava+Gson+retrofit+okhttp初步搭建android网络请求框架