Retrofit2使用手册-基础一

来源:互联网 发布:悉尼类似淘宝的app 编辑:程序博客网 时间:2024/05/21 06:50

最近一直在看一些框架,开始慢慢了解到Retrofit,查了好多资料,也看了官网的资料。最后发现,框架并不是很复杂,主要是资料太零散,而且大部分都是写给高手看的,光点题,无实例。我还是决定自己写一下,一个菜鸟的心得体会。

这篇我先写一个最最最简单的(这里面会有接口,会有泛型,会有Gson Format生成的类)

先把依赖放出来

    compile 'com.squareup.retrofit2:retrofit:2.2.0'    compile 'com.squareup.retrofit2:converter-gson:2.2.0'

首先我来说一下,这个项目需要做些什么

我有一个网址:http://cloud.bmob.cn/d9f6840be6bb07cf/wash_test?clive=wash

请求成功之后会返回一组json数据

{  "washInfo": [    {      "WashHead": "http://file.bmob.cn/M02/9A/D2/oYYBAFbD7M2Aa_YKAABfpRaTgOg207.png",      "WashName": "帽子",      "Amount": "¥5"    },    {      "WashHead": "http://file.bmob.cn/M02/9A/D3/oYYBAFbD7PyAXTQkAABh2U-waq4780.png",      "WashName": "衬衣",      "Amount": "¥10"    },    {      "WashHead": "http://file.bmob.cn/M02/9A/D3/oYYBAFbD7QqAfBcfAABwrLcpojo647.png",      "WashName": "皮衣",      "Amount": "¥100"    },    {      "WashHead": "http://file.bmob.cn/M01/9A/D4/oYYBAFbD7V-AIO99AABI0yQ_tLg889.png",      "WashName": "羽绒服",      "Amount": "¥80"    },    {      "WashHead": "http://file.bmob.cn/M01/9A/D4/oYYBAFbD7XKAQtouAACCvCGGiCo190.png",      "WashName": "唐装",      "Amount": "¥50"    },    {      "WashHead": "http://file.bmob.cn/M01/9A/D4/oYYBAFbD7XiARjlUAABkLEO8ZTU657.png",      "WashName": "西服",      "Amount": "¥150"    },    {      "WashHead": "http://file.bmob.cn/M01/9A/D4/oYYBAFbD7X6ABVjDAABtcSiw-HI923.png",      "WashName": "长袖风衣",      "Amount": "¥218"    }  ]}

要求:

1、肯定是要请求数据

2、解析json数据

3、主线程打印接受到的数据

这篇我就先完成这最基本的一套流程,接下来就看代码,注意注释哦

先看Gson Format生成的类

package com.ty.retrofit_demo2;import java.util.List;/** * Created by IT on 2017/3/31. */public class WashGson {    private List<WashInfoBean> washInfo;    public List<WashInfoBean> getWashInfo() {        return washInfo;    }    public void setWashInfo(List<WashInfoBean> washInfo) {        this.washInfo = washInfo;    }    public static class WashInfoBean {        /**         * WashHead : http://file.bmob.cn/M02/9A/D2/oYYBAFbD7M2Aa_YKAABfpRaTgOg207.png         * WashName : 帽子         * Amount : ¥5         */        private String WashHead;        private String WashName;        private String Amount;        public String getWashHead() {            return WashHead;        }        public void setWashHead(String WashHead) {            this.WashHead = WashHead;        }        public String getWashName() {            return WashName;        }        public void setWashName(String WashName) {            this.WashName = WashName;        }        public String getAmount() {            return Amount;        }        public void setAmount(String Amount) {            this.Amount = Amount;        }    }}
再看主函数

package com.ty.retrofit_demo2;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.Toast;import java.util.List;import retrofit2.Call;import retrofit2.Callback;import retrofit2.Response;import retrofit2.Retrofit;import retrofit2.converter.gson.GsonConverterFactory;import retrofit2.http.GET;/** * 请求的地址:http://cloud.bmob.cn/d9f6840be6bb07cf/wash_test?clive=wash */public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //第一步        //开始配置Retrofit        Retrofit retrofit = new Retrofit.Builder()                //请求地址:http://cloud.bmob.cn/                /**                 * 注意这里需要的是一个地址,也就是服务器的根路径,具体的请求内容并不是在这里设置;                 * 根路径只能有一个,但是根路径下会有很多的子路径也就是PATH                 * 还要注意,参数是必须以'/'结尾,不然会抛出异常                 */                .baseUrl("http://cloud.bmob.cn/")                //我请求的数据,是json格式的,我用Gson Format根据返回的数据,生成了一个类,叫做WashGson                /**                 * 如果你不需要自动解析,就想要返回一个ResponseBody(Retrofit其实是封装后的OKHTTP),可以不写这一句                 * 如果你要使用的话,记得要加上依赖:compile 'com.squareup.retrofit2:converter-gson:2.2.0'                 */                .addConverterFactory(GsonConverterFactory.create())                //生成                .build();        //第二步        //开始配置接口        /**         * 这个又是个看起来怪异的东西,我换一个大家常用的,大家看了就懂了         */        //List<String> list = new ArrayList<String>();        /**         * 首先接口不能自己实例化,必须要通过子类去实例化,         * WashService是接口,通过retrofit.create(WashService.class)去生成子类         * 是不是很清晰!!!!         */        WashService service = retrofit.create(WashService.class);        //第三步        //获得请求的一个发起器,也可以说是客户端,通过他可以发起一个完整的请求        //实例化接口以后,我们就能调用接口的函数了        Call<WashGson> washGsonCall = service.GetData();        //发起请求,网络请求是不能在UI线程调用的,但是Retrofit会自动的去子线程开启网络请求,并在UI线程回调方法        //这样我们就会很方便,对不对        washGsonCall.enqueue(new Callback<WashGson>() {            //这个会在UI线程调用            @Override            public void onResponse(Call<WashGson> call, Response<WashGson> response) {                //看到这里是不是就明白了,接口设置的时候你需要返回什么类型,只要Retrofit支持,他就会自动给你转换好
                List<WashGson.WashInfoBean> washInfoList = response.body().getWashInfo();
//此处有断点                Toast.makeText(MainActivity.this, "Data GET!!", Toast.LENGTH_SHORT).show();            }            //这个不确定他在哪个线程,因为我还无法测试,就算请求失败也是不会调用它的。            //我看了下源码注释,说他是未知异常错误,网络异常才会调用,以后用到了,我再来补充            @Override            public void onFailure(Call<WashGson> call, Throwable t) {            }        });    }    interface WashService {        //用注释表示请求的方法,方法有很多,这篇我先写一种Get,其他的分到下一篇再写        /**         * 1、首先看一下GET括号内的内容,这个就是根路径下的子路径         * 里面是可以是用通配符去解析的,之后的博客里我也会专门写一个         * 2、注意看这个:Call<WashGson>         * 这是Call是一个泛型类,而他的类型由我们来指定,并且这个类型就是我们之后所需要接受到的数据         * 如果你只想要一个ResponseBody,这里就写成Call<ResponseBody>         * 3、@GET是框架定义的,名字代表这方法,但是其他的包括接口的名字,函数的名字,请随意         * 4、最后一点要注意,Call<WashGson>这个是返回值!!!!!!         */        @GET("d9f6840be6bb07cf/wash_test?clive=wash")        Call<WashGson> GetData();    }}
来看一下结果,我打了个断点,用debug看了下请求结果



可以看到已经得到结果了,好了这篇就到这里,欢迎拍砖



0 0
原创粉丝点击