Android从零开搞系列:网络框架系列(3)Retrofit+RxJava+MVP(上)Retrofit

转载请注意: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

简单来说它是一个网络请求框架。但从这一点上来说我们有很多可以选择的方案,比如:原生的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值