Retrofit + RxJava 之 Android 应用
2016-07-31 本文已影响268人
阿敏其人
本文出自 “阿敏其人” 简书博客,转载或引用请注明出处。
前言,为什么要使用RxJava,因为当异步操作很多的时候,应用RxJava可以让条例更加清晰。
那么为什么用Retrofit呢?因为Retrofit2之后内置内置okhttp,oh是大势所趋,加上Retrofit和RxJava两者配合起来非常搭,所以要RxJava+Retrofit。
一、Retrofit的简单使用
我们就以为一个请求天气的GET请求展开描述,完整的api
http://apistore.baidu.com/microservice/weather?citypinyin=beijing
请求Json结果:
{
"errNum": 0,
"errMsg": "success",
"retData": {
"city": "接口已经停用",
"pinyin": "apistore.baidu.com",
"citycode": "000000000",
"date": "201616-05-12",
"time": "10:00",
"postCode": "0000000",
"longitude": 0,
"latitude": 0,
"altitude": "0",
"weather": "多云",
"temp": "0",
"l_tmp": "0",
"h_tmp": "0",
"WD": "北风",
"WS": "接口已经停用,请访问APIStore.baidu.com查找对应接口",
"sunrise": "00:00",
"sunset": "00:00"
}
}
接口看完了,数据看完了,代码页可以开始了。
一、1、最简单的Retrofit调用
gradle引入
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.google.code.gson:gson:2.7'
弄一个APIServer接口,写上我们的请求方法
public interface APIService {
// 发送get请求,光是这段地址肯定不完整,待会我们还在在别的地方补上 baseurl 。 这里直接把后面的请求给写死了(这样肯定不好)
@GET("/microservice/weather?citypinyin=beijing")
Call<WeatherBean> getWeather();
}
MainActivity
public class MainActivity extends AppCompatActivity {
private TextView mTvGetData;
private TextView mTvResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTvGetData = (TextView) findViewById(R.id.mTvGetData);
mTvResult = (TextView) findViewById(R.id.mTvResult);
mTvGetData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getData();
}
});
}
private void getData() {
String baseUrl = "http://apistore.baidu.com/";
// 创建一个 retrofit ,baseUrl必须有
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
// 利用 retrofit 创建一个接口
APIService apiService = retrofit.create(APIService.class);
// 利用接口创建一个Call对象
Call<WeatherBean> weatherBeanCall = apiService.getWeather();
// 请求入队,回调请求成功或者失败
weatherBeanCall.enqueue(new Callback<WeatherBean>() {
@Override
public void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {
WeatherBean jo = response.body();
System.out.println("请求成功:"+response.body().getRetData().getWeather());
mTvResult.setText("请求成功:"+response.body().getRetData().getWeather());
}
@Override
public void onFailure(Call<WeatherBean> call, Throwable t) {
System.out.println("请求失败");
mTvResult.setText("请求失败:"+t.toString());
}
});
}
}
image.png
一、2、传参调用
我们改变一下APIServer的一点代码
使用了@Query,后面的 citypinyin 是参数名
public interface APIService {
// 发送get请求,光是这段地址肯定不完整,待会我们还在在别的地方补上 baseurl 。 这里直接把后面的请求给写死了(这样肯定不好)
// 请求还是Get
@GET("/microservice/weather")
Call<WeatherBean> getWeather(@Query("citypinyin") String city); // 使用了@Query,后面的 citypinyin 是参数名
}
接着看一下Activity
private void getData() {
String baseUrl = "http://apistore.baidu.com/";
// 创建一个 retrofit ,baseUrl必须有
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
// 利用 retrofit 创建一个接口
APIService apiService = retrofit.create(APIService.class);
// 利用接口创建一个Call对象
Call<WeatherBean> weatherBeanCall = apiService.getWeather("beijing");
// 请求入队,回调请求成功或者失败
weatherBeanCall.enqueue(new Callback<WeatherBean>() {
@Override
public void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {
WeatherBean jo = response.body();
System.out.println("请求成功:"+response.body().getRetData().getWeather());
mTvResult.setText("请求成功:"+response.body().getRetData().getWeather());
}
@Override
public void onFailure(Call<WeatherBean> call, Throwable t) {
System.out.println("请求失败");
mTvResult.setText("请求失败:"+t.toString());
}
});
}
其实变化的也就是一行代码
Call<WeatherBean> weatherBeanCall = apiService.getWeather("beijing");
运行效果一致。
一、3、简单使用三 @Path
可以参考此文
[Android] Retrofit 初步使用
关键如下截图
image_1am6fr617kjr14tlnprnditc7m.png