接下来把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()可以用来控制代码的执行线程。