Retrofit结合RxJava2使用

###相关文章

添加依赖,

首先,我们需要在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) {

            }
        });

    }

####结果演示
这里写图片描述

注:可以到这里去下载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() {

            }
        });
    }

####结果展示
这里写图片描述

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

从图中可以看出,俩中方式都获取到了最终的用户信息。
###写在后面
从上面的例子可以看出。Retrofit和Rxjava2结合使用方式,大大的简化了我们的代码,后期维护也变的很简单。
###一些实用工具文旦下载地址:
Gif图片录制软件:Gif图片录制软件,可以帮助录制电脑屏幕上任意大小内容任意时间长度,而且还可以自己调节内容,可以断点续录。
RxJava中文文档:Rxjava目前来说是非常流行的异步框架,掌握Rxjava可以在工作中得心应手,这里提供Rxjava中文文档。可以帮助你更好更快的掌握这项技术。
GifView(Gif图片播放器):Gif图片播放器,可以帮助你,像看电影一样,调节图播放的进度,而且还可以暂停播放
Android逆向助手:反编译别人的App是不道德的,但是,如果是为了纯粹的学习,提升自己,还是可以的,Android逆向助手,可以帮助你,获取到你想要的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值