最近一直在看一些框架,开始慢慢了解到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看了下请求结果
可以看到已经得到结果了,好了这篇就到这里,欢迎拍砖