Android RxJava 实战讲解:优雅实现 网络请求轮询

原创 2017年10月17日 08:56:48

前言

  • Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。

Github截图

如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的Rxjava 入门教程


  • RxJava如此受欢迎的原因,在于其提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求
  • 今天,我将为大家带来 Rxjava创建操作符的常见开发应用场景:轮询需求 ,并结合RetrofitRxJava 实现,希望大家会喜欢。

  1. 本系列文章主要基于 Rxjava 2.0
  2. 接下来的时间,我将持续推出 AndroidRxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记!!

  3. 示意图

目录

示意图


1. 需求场景

示意图

注:关于 Rxjava中的延时创建操作符interval()intervalRange()的使用请看文章Android RxJava:最基础的操作符详解 - 创建操作符


2. 功能说明

本文将采用Get方法对 金山词霸API 按规定时间 重复发送网络请求,从而模拟 轮询 需求实现

采用 Gson 进行数据解析

金山词典


3. 具体实现

下面我将结合 RetrofitRxJava 实现轮询需求

3.1 步骤说明

  1. 添加依赖
  2. 创建 接收服务器返回数据 的类
  3. 创建 用于描述网络请求 的接口(区别于传统Retrofit形式)
  4. 创建 Retrofit 实例
  5. 创建 网络请求接口实例 并 配置网络请求参数(区别于传统Retrofit形式)
  6. 发送网络请求(区别于传统Retrofit形式)
  7. 发送网络请求
  8. 对返回的数据进行处理

本实例侧重于说明 RxJava 的轮询需求,关于Retrofit的使用请看文章:这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)

3.2 步骤实现

步骤1: 添加依赖

a. 在 Gradle加入Retrofit库的依赖

build.gradle

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'

}

b. 添加 网络权限
AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>
步骤2:创建 接收服务器返回数据 的类
  • 金山词霸API 的数据格式说明如下:
// URL模板
http://fy.iciba.com/ajax.php

// URL实例
http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello%20world

// 参数说明:
// a:固定值 fy
// f:原文内容类型,日语取 ja,中文取 zh,英语取 en,韩语取 ko,德语取 de,西班牙语取 es,法语取 fr,自动则取 auto
// t:译文内容类型,日语取 ja,中文取 zh,英语取 en,韩语取 ko,德语取 de,西班牙语取 es,法语取 fr,自动则取 auto
// w:查询内容
  • 示例

API格式说明

  • 根据 金山词霸API 的数据格式,创建 接收服务器返回数据 的类:

Translation.java

public class Translation {

    private int status;

    private content content;
    private static class content {
        private String from;
        private String to;
        private String vendor;
        private String out;
        private int errNo;
    }

    //定义 输出返回数据 的方法
    public void show() {
        Log.d("RxJava", content.out );
    }
}
步骤3:创建 用于描述网络请求 的接口

采用 注解 + Observable<...>接口描述 网络请求参数

GetRequest_Interface.java

public interface GetRequest_Interface {

    @GET("ajax.php?a=fy&f=auto&t=auto&w=hi%20world")
    Observable<Translation> getCall();
     // 注解里传入 网络请求 的部分URL地址
    // Retrofit把网络请求的URL分成了两部分:一部分放在Retrofit对象里,另一部分放在网络请求接口里
    // 如果接口里的url是一个完整的网址,那么放在Retrofit对象里的URL可以忽略
    // 采用Observable<...>接口 
    // getCall()是接受网络请求数据的方法
}
接下来的步骤均在RxJavafixRxjava.java内实现(请看注释)

RxJavafixRxjava.java

public class RxJavafixRxjava extends AppCompatActivity {

    private static final String TAG = "Rxjava";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /*
         * 步骤1:采用interval()延迟发送
         * 注:此处主要展示无限次轮询,若要实现有限次轮询,仅需将interval()改成intervalRange()即可
         **/
        Observable.interval(2,1, TimeUnit.SECONDS)
                // 参数说明:
                // 参数1 = 第1次延迟时间;
                // 参数2 = 间隔时间数字;
                // 参数3 = 时间单位;
                // 该例子发送的事件特点:延迟2s后发送事件,每隔1秒产生1个数字(从0开始递增1,无限个)

                 /*
                  * 步骤2:每次发送数字前发送1次网络请求(doOnNext()在执行Next事件前调用)
                  * 即每隔1秒产生1个数字前,就发送1次网络请求,从而实现轮询需求
                  **/
                 .doOnNext(new Consumer<Long>() {
            @Override
            public void accept(Long integer) throws Exception {
                Log.d(TAG, "第 " + integer + " 次轮询" );

                 /*
                  * 步骤3:通过Retrofit发送网络请求
                  **/
                  // a. 创建Retrofit对象
                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url
                        .addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
                        .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 支持RxJava
                        .build();

                  // b. 创建 网络请求接口 的实例
                GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);

                  // c. 采用Observable<...>形式 对 网络请求 进行封装
                  Observable<Translation> observable = request.getCall();
                  // d. 通过线程切换发送网络请求
                  observable.subscribeOn(Schedulers.io())               // 切换到IO线程进行网络请求
                        .observeOn(AndroidSchedulers.mainThread())  // 切换回到主线程 处理请求结果
                        .subscribe(new Observer<Translation>() {
                            @Override
                            public void onSubscribe(Disposable d) {
                            }

                            @Override
                            public void onNext(Translation result) {
                                // e.接收服务器返回的数据
                                result.show() ;
                            }

                            @Override
                            public void onError(Throwable e) {
                                Log.d(TAG, "请求失败");
                            }

                            @Override
                            public void onComplete() {

                            }
                        });

            }
        }).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {

            }
            @Override
            public void onNext(Long value) {

            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "对Error事件作出响应");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "对Complete事件作出响应");
            }
        });


    }
}



3.3 测试结果

示意图


4. Demo地址

Carson_Ho的Github地址 = RxJava2实战系列:轮询


5. 总结

  • 本文主要讲解了 Rxjava创建操作符的实际开发需求场景:轮询需求 ,并结合RetrofitRxJava 实现
  • 接下来的时间,我将持续推出 AndroidRxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记!!

示意图


请 帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

版权声明:本文为博主原创文章,未经博主允许不得转载,更多文章请继续关注Carson_Ho的博客!

相关文章推荐

Android:RxJava 结合 Retrofit 优雅实现 网络请求轮询

前言 Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。 如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的R...

使用Retrofit和RxJava进行轮询操作

根据前面几篇博客,已经大致明白了Retrofit和RxJava的使用。现在把这些知识结合起来,实现一个轮询操作。轮询流程轮询的过程是:现查询userId,得到userId以后上传图片,如果图片上传成功...

(六)RxJava轮询器:interval

对于轮询器大家一定不陌生,开发中无论是Java的Timer+TimeTask , 还是Android的Hanlder都可实现,那么现在给大家再介绍种简单的实现方式:利用RxJava的Interval操...

可能是东半球最全的RxJava使用场景小结

知道RxJava吗?这里罗列了东半球最全的RxJava使用场景哦,快来看看吧~

RxJava interval 轮询

RxJava interval 轮询 取消因为最近在使用RxJava 所以将自己所学到的一些小知识拿来和大家分享:interval 是一种是每隔一段时间就产生一个数字,没有结束符,也就是是可以产生无...

RxJava学习(二)——RxJava使用场景总结

11个RxJava的实例集合 类名一一对应内容,分别是: MainActivity——RxJava基础用法 simplestAty——RxJava简单实例 timer——延时操作 i...

RxJava(RxAndroid)入门级教程及衍生教程

概念介绍RxJava只是ReactiveX(Reactive Extensions)的一种java实现, ReactiveX是一种响应式扩展框架,有很多种实现,如RxAndroid, RxJS, Rx...

从零开始的RxJava2.0教程(四)在安卓中的应用

1. 前言在第1 2 3篇中,我介绍了RxJava 2.0的基本用法。这一篇将介绍在安卓中的基本用法。 附上本系列教程的链接。 从零开始的RxJava2.0教程(一)基础 从零开始的RxJava...

RxAndroid教程

原文链接:https://github.com/xitu/gold-miner/blob/master/TODO/rxandroid-tutorial.md 面向初学者的一篇翻译友好的 RxJava...

RxAndroid 教程

原文:RxAndroid Tutorial 作者: Artem Kholodnyi 译者:kmyhy 有人说你应该以积极的心态面对生活,而不是消极应对。但是,在 Android 开发中恰恰...
  • kmyhy
  • kmyhy
  • 2017年03月21日 17:15
  • 2059
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android RxJava 实战讲解:优雅实现 网络请求轮询
举报原因:
原因补充:

(最多只允许输入30个字)