天天看点

Retrofit结合RxJava2使用

###相关文章

  • 观察者模式实例讲解
  • 使用java中的类(Observable与Observer)实现观察者模式
  • Rx_java2的基本使用
  • Rx_java2中的线程控制
  • Rx_java2操作符介绍1(Map、Flatmap)
  • Rx_java2操作符介绍2(debounce 、filter 、switchMap )
  • Rx_java2操作符介绍3(throttleFirst、debounce )

    ###写在前面

  • Retrofit: Retrofit是Square公司开源的一个高质量高效率的http库,它将我们自己开发的底层代码和细节都封装了起来。在没有Retrofit,okHttp等库的时候,我们可能要自己去写put,get,post,delete请求。但有了这些库之后对于这些请求我们就只需要一行代码或者是一个注解。更多信息参考Retrofit文档
  • **RxJava:**关于RxJava的详细介绍,大家可以到这里下载去看RxJava中文文档,然后对比我的RxJava系列讲解去系统的学习RxJava的使用。

添加依赖,

首先,我们需要在build.gradle文件中添加依赖

// Rx依赖
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'io.reactivex.rxjava2:rxjava:2.1.7'

    // retrofit
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    // r将retrofit结果转换为对象模型
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    // Rx与Retrofit结合依赖
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
           

接下来,我将通过案例的方式来介绍RxJava和Retrofit结合使用带来的便捷,并且与不使用RxJava方式作对比:

###案列服务器数据介绍

服务器我简单的使用的tomcat,获取俩个json字符串

主机地址使用我自己的ip地址http://192.168.1.123:8080/

登录接口为 retrofitDemo/login.json

获取用户接口为retrofitDemo/userInfo.json

获取到的json数据分别为

// 登陆成功
{"success":true,"message":"login success !","user_id":110}
// 获取用户信息‘
{"username":"dujun","head_url":"www.baidu.com","id":"110"}
           

###传统方式(不用RxJava方式) - 登录,并获取用户信息(仅用retrofit)案例

首相,创建Retrofit的Api接口,

/**
 * description:
 * author: dujun
 * created at: 2018/1/10 11:54 
 * update: 2018/1/10
 * version: 
 */
public interface Api {
    /**
     * 登录
     * @param userParam
     * @return
     */
    @POST("retrofitDemo/login.json")
    Call<BaseResult> login(@Body UserParam userParam);

    /**
     * 获取用户信息
     * @param userParam
     * @return
     */
    @POST("retrofitDemo/userInfo.json")
    Call<User> getUserInfo(@Body UserParam userParam);
}
           

然后创建Retrofit,并创建Api

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.1.123:8080/")
                // 添加Gson转换,结果将会自动转化为数据模型
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        api = retrofit.create(Api.class);
           

调用api中的登录方法登录,,登录成功后,再调用api中的获取用户信息接口,获取用户信息

public void login(View view){
        api.login(new UserParam("dujun","123456")).enqueue(new Callback<BaseResult>() {
            @Override
            public void onResponse(Call<BaseResult> call, Response<BaseResult> response) {
                // 获取请求结果,此处在ui线程
                if(response != null){
                    BaseResult result = response.body();
                    // 登录成功,继续获取用户信息
                    api.getUserInfo(result.user_id).enqueue(new Callback<User>() {
                        @Override
                        public void onResponse(Call<User> call, Response<User> response) {
                            User body = response.body();

                            // 获取用户信息,并显示在界面上
                            StringBuilder builder = new StringBuilder();
                                                        String userString = builder.append("head_url : " + body.head_url).append("         ").append("user_id : " + body.id).append(" ").append("username : " + body.username).toString();

                            mTv.setText(userString);
                        }

                        @Override
                        public void onFailure(Call<User> call, Throwable t) {

                        }
                    });
                }
            }

            @Override
            public void onFailure(Call<BaseResult> call, Throwable t) {

            }
        });

    }
           

####结果演示

Retrofit结合RxJava2使用

注:可以到这里去下载Gif图片录制软件

可以看到,首先通过retrofit登陆成功。获取到用户id。然后再次通过id去获取用户信息。并显示在界面上。

Retrofit和Rxjava结合使用- 登录,成功后获取用户信息案例、

首相,我们要添加转换器

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.1.123:8080/")
                // 添加Gson转换,结果将会自动转化为数据模型
                .addConverterFactory(GsonConverterFactory.create())
                
                // 添加RxJava转换
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
           

**注意:**不加或者参数类型不对,报异常: Could not locate call adapter for io.reactivex.Observable…

接下来,我们直接修改Api接口中方法的返回值为Observable

/**
     * RxJava和Retrofit结合完成登录操作
     * @param userParam
     * @return
     */
    @POST("retrofitDemo/login.json")
    Observable<BaseResult> loginWithRxJava(@Body UserParam userParam);

    /**
     * Rxjava和Retrofit结合完成获取用户信息操作
     * @param
     * @return
     */
    @POST("retrofitDemo/userInfo.json")
    Observable<User> getUserInfoWithRxJava(@Body int userId);
           

在代码中调用方法, 注释中已经详细介绍。

public void loginRxJava(View view){
        // 登录
        api.loginWithRxJava(new UserParam("dujun", "123456"))

        // flatMap转换操作,将BaseResult转换为ObservableSource<User>>发射器(被观察者对象)
        .flatMap(new Function<BaseResult, ObservableSource<User>>() {
            @Override
            public ObservableSource<User> apply(@NonNull BaseResult baseResult) throws Exception {
                // 联网获取用户信息
                Observable<User> observable1 = api.getUserInfoWithRxJava(baseResult.user_id);
                return observable1;
            }
        })
                // 将Observable执行的操作放在子线程(请求网络获取数据)
        .subscribeOn(Schedulers.io())
        // 将Observer执行的操作放在ui线程
        .observeOn(AndroidSchedulers.mainThread())

        // 注册绑定Observer
        .subscribe(new Observer<User>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull User user) {
                // 获取users数据,并显示在界面
                StringBuilder builder = new StringBuilder();
                String userString = builder.append("RxJava和Retrofit结合获取的数据:").append("head_url : " + user.head_url).append("         ").append("user_id : " + user.id).append("    ").append("username : " + user.username).toString();
                mTv.setText(userString);
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
    }
           

####结果展示

Retrofit结合RxJava2使用

注:可以到这里去下载Gif图片录制软件

从图中可以看出,俩中方式都获取到了最终的用户信息。

###写在后面

从上面的例子可以看出。Retrofit和Rxjava2结合使用方式,大大的简化了我们的代码,后期维护也变的很简单。

###一些实用工具文旦下载地址:

Gif图片录制软件:Gif图片录制软件,可以帮助录制电脑屏幕上任意大小内容任意时间长度,而且还可以自己调节内容,可以断点续录。

RxJava中文文档:Rxjava目前来说是非常流行的异步框架,掌握Rxjava可以在工作中得心应手,这里提供Rxjava中文文档。可以帮助你更好更快的掌握这项技术。

GifView(Gif图片播放器):Gif图片播放器,可以帮助你,像看电影一样,调节图播放的进度,而且还可以暂停播放

Android逆向助手:反编译别人的App是不道德的,但是,如果是为了纯粹的学习,提升自己,还是可以的,Android逆向助手,可以帮助你,获取到你想要的