接下来把Rxjava在实际的项目中使用,并结合Retrofit网络库,源码参考个人作品【图灵机器人】

看一张示例Demo图

Demo下载地址

仅使用Retrofit请求图灵API接口,获得问答信息

    private void requestApiByRetrofit(String info) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(TulingParams.TULING_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        RetrofitApi api = retrofit.create(RetrofitApi.class);

        Call<MessageEntity> call = api.getTuringInfo(TulingParams.TULING_KEY, info);
        call.enqueue(new Callback<MessageEntity>() {
            @Override
            public void onResponse(Call<MessageEntity> call, Response<MessageEntity> response) {
                handleResponseMessage(response.body());
            }

            @Override
            public void onFailure(Call<MessageEntity> call, Throwable t) {
            }
        });
    }

Retrofit是Square公司提供的一个类型安全的Http Client,由于Retrofit本身是支持RxJava的,因此这两者理所当然搭配使用。

使用RxJava和Retrofit请求图灵API接口,获得问答信息

    private void requestApiByRetrofit_RxJava(String info) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(TulingParams.TULING_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

        RetrofitApi api = retrofit.create(RetrofitApi.class);

        api.getTuringInfoByRxJava(TulingParams.TULING_KEY, info)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<MessageEntity>() {
                    @Override
                    public void onCompleted() {
                    }

                    @Override
                    public void onError(Throwable e) {
                    }

                    @Override
                    public void onNext(MessageEntity entity) {
                        handleResponseMessage(entity);
                    }
                });
    }

与上一节使用与分析不同的是这节中使用了RxJava的Scheduler调度器,通过Scheduler可以指定代码执行的线程。
下面列举了RxJava内置的几种线程:
AndroidSchedulers.mainThread() 主线程
Schedulers.immediate() 当前线程,即默认Scheduler
Schedulers.newThread() 启用新线程
Schedulers.io() IO线程,内部是一个数量无上限的线程池,可以进行文件、数据库和网络操作。
Schedulers.computation() CPU计算用的线程,内部是一个数目固定为CPU核数的线程池,适合于CPU密集型计算,不能操作文件、数据库和网络。
subscribeOn()和observeOn()可以用来控制代码的执行线程。