大家开发过程中或多或少都会用上网络请求,写法也各有千秋,下面我来介绍一下使用Retrofit和Rxjava来优雅地实现网络请求,关于Retrofit和Rxjava的介绍我就不多说了,毕竟研究的不深,大家可以看看其他大牛的博客,下面直接进入主题。
代码特点:代码简洁,方便管理
1、添加依赖
// Android 支持 Rxjava
// 此处一定要注意使用RxJava2的版本
compile 'io.reactivex.rxjava2:rxjava:2.1.11'
compile 'io.reactivex.rxjava2:rxandroid:2.0.2'
// Android 支持 Retrofit
compile 'com.squareup.retrofit2:retrofit:2.3.0'
// 衔接 Retrofit & RxJava
// 此处一定要注意使用RxJava2的版本
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
// 支持Gson解析
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.0.2'
//支持butterknife
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
2、添加权限
<uses-permission android:name="android.permission.INTERNET"/>
3、定义一个接口来进行网络请求和数据返回
public interface GetRequestInterface {
// 网络请求
@GET("query?")
Observable<Translation1> getCallIntent(@Query("subject") String subject ,
@Query("model") String model,
@Query("key") String key,
@Query("testType") String testType );
}
4、json返回示例
{
"error_code": 0,
"reason": "ok",
"result": [
{
"id": 12,
"question": "这个标志是何含义?",//问题
"answer": "4",//答案
"item1": "前方40米减速",//选项,当内容为空时表示判断题正确选项
"item2": "最低时速40公里",//选项,当内容为空时表示判断题错误选项
"item3": "限制40吨轴重",
"item4": "限制最高时速40公里",
"explains": "限制最高时速40公里:表示该标志至前方限制速度标志的路段内,机动车行驶速度不得超过标志所示数值。此标志设在需要限制车辆速度的路段的起点。以图为例:限制行驶时速不得超过40公里。",//答案解释
"url": "http://images.juheapi.com/jztk/c1c2subject1/12.jpg"//图片url
}
]
}
5、定义一个数据类Translation1
public class Translation1 {
private String error_code;
private String reason;
private result[] result;
private static class result {
private String id;
private String question;
private String answer;
private String item1;
private String item3;
private String item2;
private String item4;
private String explains;
private String url;
}
//定义 输出返回数据 的方法
public void show() {
Log.d("RxJava", reason);
}
public String getResult(){
return result[0].id+"\n"+result[0].question+"\n"+result[0].answer;
}
}
6、mainActivity(注意看注释)
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@BindView(R.id.hello)
Button hello;
@BindView(R.id.httpText)
TextView httpText;
Observable<Translation1> observable1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
hello.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 步骤1:创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://v.juhe.cn/jztk/") // 设置 Url
.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 设置支持RxJava
.build();
// 步骤2:创建 网络请求接口 的实例
GetRequestInterface request = retrofit.create(GetRequestInterface.class);
// 步骤3:采用Observable<...>形式 对 2个网络请求 进行封装
observable1 = request.getCallIntent("1","c1","key","rand");
//observable1 = request.getCall();
observable1.subscribeOn(Schedulers.io()) // (初始被观察者)切换到IO线程进行网络请求1
.observeOn(AndroidSchedulers.mainThread()) // (新观察者)切换到主线程 处理网络请求1的结果
.subscribe(new Consumer<Translation1>() {
@Override
public void accept(Translation1 translation1) throws Exception {
httpText.setText(translation1.getResult());//显示文本
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.d(TAG, "accept: "+"请求失败");
}
});
}
});
}
}
7’、效果图
不足自出,敬请指出