结合 Retrofit 与RxJava 实现网络请求功能。
具体步骤:
- 添加依赖
- 创建接收服务器返回数据的类
- 创建用于描述网络请求的接口(区别于Retrofit传统形式)
- 创建Retrofit 实例
- 创建网络请求接口实例并配置网络请求参数(区别于Retrofit传统形式)
- 发送网络请求(区别于Retrofit传统形式)
- 对返回的数据进行处理
添加依赖:
dependencies {
// Android 支持 Rxjava
// 此处一定要注意使用RxJava2的版本
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
// Android 支持 Retrofit
compile 'com.squareup.retrofit2:retrofit:2.1.0'
// 衔接 Retrofit & RxJava
// 此处一定要注意使用RxJava2的版本
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
// 支持Gson解析
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
}
添加 网络权限
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
创建接收服务器返回数据的类
这里用金山词霸API
// URL模板
http://fy.iciba.com/ajax.php
// URL实例
http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello%20world
{
"status": 1,
"content": {
"from": "en-EU",
"to": "zh-CN",
"out": "示例",
"vendor": "ciba",
"err_no": 0
}
}
安装gsonformat插件,用于生成服务器返回格式的类。
用法很简单,比如你先建立一个新的空类取名Book,然后在里面按Alt+insert,会有个小弹窗选择GsonFormat,之后在弹出的编辑框中拷入在浏览器中请求下来的那一坨东西,然后一直点ok就会自动生成字段,以及set和get方法,一会儿我们用Retrofit请求下来的数据都会保存在这个实体类中,还是挺方便的。最后我们里面添加一个toString()方法,用于后面显示方便。
public class Book {
/**
* content : {"vendor":"ciba","from":"en-EU","to":"zh-CN","err_no":0,"out":"示例"}
* status : 1
*/
private int status;
private content content;
public class content {
/**
* vendor : ciba
* from : en-EU
* to : zh-CN
* err_no : 0
* out : 示例
*/
private String vendor;
private String from;
private String to;
private int err_no;
private String out;
}
public void show() {
Log.i("BOOK", content.out);
创建用于描述网络请求的接口
采用 注解 + Observable<…>接口描述 网络请求参数
public interface GetRequest_Interface {
@GET("ajax.php?a=fy&f=auto&t=auto&w=hi%20world")
Observable<Book> getCall();
// 注解里传入 网络请求 的部分URL地址
// Retrofit把网络请求的URL分成了两部分:一部分放在Retrofit对象里,另一部分放在网络请求接口里
// 如果接口里的url是一个完整的网址,那么放在Retrofit对象里的URL可以忽略
// 采用Observable<...>接口
// getCall()是接受网络请求数据的方法
}
最后在MainActivity中实现网络请求操作
public class MainActivity extends AppCompatActivity {
private OkHttpClient okHttpClient = new OkHttpClient();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 步骤1:创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://fy.iciba.com/")//设置 网络请求 Url
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())//设置使用Gson解析(记得加入依赖)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 支持RxJava
.build();
//创建网络请求接口实例
GetRequest_Interface service = retrofit.create(GetRequest_Interface.class);
// 步骤3:采用Observable<...>形式 对 网络请求 进行封装
Observable<Book> observable = service.getCall();
observable.subscribeOn(Schedulers.io()) // 切换到IO线程进行网络请求
.observeOn(AndroidSchedulers.mainThread())// 切换回到主线程 处理请求结果
.subscribe(new Observer<Book>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Book value) {
value.show();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}