您的位置:首页 > 理论基础 > 计算机网络

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。

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 mvp Retrofit RxJava
相关文章推荐