Retrofit和RxJava简单使用

时间:2021-05-25 17:47:13

结合 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() {

                    }
                });
    }
}

参考文章:http://blog.csdn.net/carson_ho/article/details/78651602

Demo下载