Android:Retrofit 结合 RxJava的雅致使用(含实例教程)Android RxJava 实际使用讲解:(有标准)网络要轮询(结合Retrofit)


前言

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

Github截图

若是还无了解RxJava,请圈文章:Android:这是平等首 清晰 & 易懂的Rxjava
入门教程

  • RxJava如此给欢迎的由,在于那供了长 &
    功能强大的操作符,几乎能做到所有的力量需求
  • 今天,我将为大家带来
    Rxjava创立操作符的实则开发需要状况:有极的轮询需求
    ,并结合RetrofitRxJava 实现,希望大家见面爱。
  1. 随系列文章要依据 Rxjava 2.0
  2. 连片下去的工夫,我将随地推出 AndroidRxjava 2.0
    的平密密麻麻文章,包括原理、操作符、应用场景、背压等等

    ,有趣味可以继承关注Carson_Ho的安卓开发笔记!!

示意图


前言

  • Andrroid支出中,网络要十分常用,而当Android纱要求库中,Retrofit是立极端暖的一个网络要求库

Github截图

  • Retrofit为此当当今不过风靡的纱要库,其中一个生死攸关由是:支持RxJavaRxjava由于其基于事件流的链式调用、逻辑简洁
    & 使用简单
    的特色,深受各大 Android开发者的迎接。

Github截图

  • 今,我以为大家带来 Retrofit
    结合Rxjava实则用案例教学,即广大开发以场景实现
    ,希望大家见面爱。

本文主要根据Retrofit 2.0 & Rxjava 2.0

  1. 本系列文章要依据 Rxjava 2.0
  2. 联网下去的辰,自将持续生产 AndroidRxjava 2.0
    的等同多重文章,包括原理、操作符、应用场景、背压等等

    ,有趣味可以延续关注Carson_Ho的安卓开发笔记!!

示意图


目录

示意图


目录

示意图


1. 需求状况

示意图

注:关于 Rxjava中的repeatWhen() 操作符的下要圈文章Android
RxJava:功能性操作符 全面授课


1. Retrofit 简介

示意图

特别注意:

  • 规范来说,Retrofit 是一个 RESTful 的 HTTP 网络要框架的卷入。
  • 由:网络要的办事精神上是 OkHttp 完成,而 Retrofit 仅负责
    网络要接口的包

关于Retrofit的一发详实介绍请圈文章:当时是千篇一律客大详细的 Retrofit 2.0
使用教程(含实例讲解)


2. 效果说明

采用Get方对 金山词霸API 按规定时又发送网络要,从而模拟 轮询
需求实现

  1. 停止轮询的标准 = 当轮询到第4软时
  2. 采用 Gson 进行多少解析

金山词典


2. RxJava简介

示意图

关于RxJava的尤为详细介绍请看文章:Android Rxjava:这是平等首 清晰 &
易懂的Rxjava 入门教程


3. 具体实现

下,我以成 RetrofitRxJava 实现 有谱的轮询需求

3. 二者结合使用

  • Retrofit于是当本极盛的大网要库,其中一个着重原因是:支持RxJava

即:Retrofit除此之外提供传统的纱要方式外,还提供 RxJava 版本的
网络请求方式

  • 少数种植办法于利用及最深的分别在于:传统艺术采取了 Callback
    接口,而RxJava 方式则以了Observable接口。主要体现在:

    1. 用以描述网络要求 的接口 的安装
    2. 网要的卷入形式 & 发送形式

3.1 步骤说明

  1. 长依赖
  2. 开创 接收服务器返回数据 的类
  3. 创办 用于描述网络要求 的接口(区别为Retrofit风土样式)
  4. 创建 Retrofit 实例
  5. 缔造 网络要接口实例 并
    配置网络要参数(区别为Retrofit传统花样)
  6. 出殡网络要(区别为Retrofit风形式)
  7. 发送网络要
  8. 针对回的数码开展处理

本实例侧重于说明 RxJava
的轮询需求,关于Retrofit的动要圈文章:立即是如出一辙卖大详细的 Retrofit
2.0 使用教程(含实例讲解)

a. 用于描述网络要求 的接口设置

// 传统方式:Call<..>接口形式
public interface GetRequest_Interface {
 @GET("url地址")
    Call<Translation> getCall();
    // 注解里传入 网络请求 的部分URL地址
    // getCall()是接受网络请求数据的方法
}

//  RxJava 方式:Observable<..>接口形式
 @GET("url地址")
public interface GetRequest_Interface {
Observable<Translation> getCall();

3.2 步骤实现

b. 网络要的卷入形式 & 发送形式不同

<-- 传统方式 ->>
        // 1. 创建 网络请求接口 的实例
        GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);

        // 2. 采用Call<..>接口 对 发送请求 进行封装
        Call<Translation> call = request.getCall();

        // 3. 发送网络请求(异步)
        call.enqueue(new Callback<Translation>() {
            // 请求成功时回调
            @Override
            public void onResponse(Call<Translation> call, Response<Translation> response) {
                 ...  
            }

            // 请求失败时回调
            @Override
            public void onFailure(Call<Translation> call, Throwable throwable) {
                ....
            }
        });


<-- RxJava 版方式 ->>
        // 1. 创建 网络请求接口 的实例
        GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);

        // 2. 采用Observable<...>形式 对 网络请求 进行封装
        Observable<Translation> observable = request.getCall();

        // 3. 发送网络请求(异步)
        observable.subscribeOn(Schedulers.io())               // 在IO线程进行网络请求
                  .observeOn(AndroidSchedulers.mainThread())  // 回到主线程 处理请求结果
                  .subscribe(new Observer<Translation>() {

                    // 发送请求后调用该复写方法(无论请求成功与否)
                    @Override
                    public void onSubscribe(Disposable d) {
                        ...// 初始化工作
                      }

                    // 发送请求成功后调用该复写方法
                    @Override
                    public void onNext(Translation result) {
                        ...// 对返回结果Translation类对象 进行处理
                    }

                    // 发送请求成功后,先调用onNext()再调用该复写方法
                    @Override
                    public void onComplete() {
                        Log.d(TAG, "请求成功");
                    }
                    // 发送请求失败后调用该复写方法
                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "请求失败");
                    }

                });
    }

步骤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"/>

4. 基础运用

下面,我以用最基础之 Retrofit + RxJava 实现 网络要求 的法力

手续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 );
    }
}

4.1 功能说明

  • 兑现力量:将中文翻译成英文 – > 显示到界面
  • 落实方案:采用Get方法对 金山词霸API 发送网络要
  1. 事先切换到工作线程 发送网络要
  2. 再也切换到主线程进行 UI更新

金山词典

手续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()是接受网络请求数据的方法
}

4.2 步骤说明

  1. 添加凭
  2. 创 接收服务器返回数据 的切近
  3. 始建 用于描述网络要求 的接口(区别为人情样式)
  4. 创建 Retrofit 实例
  5. 开创 网络要接口实例 并 配置网络要参数(区别为人情样式)
  6. 发送网络要(区别为人情式)
  7. 出殡网络要
  8. 针对回到的数量进行拍卖

本实例侧重于说明 RxJava
的线程控制,关于Retrofit的使用要看文章:即是同样卖非常详细的 Retrofit
2.0 使用教程(含实例讲解)

连通下去的步子都以RxJavafixRxjava.java外实现(请看注释)

RxJavafixRxjava.java

public class RxJavafixRetrofit extends AppCompatActivity {

    private static final String TAG = "Rxjava";

    // 设置变量 = 模拟轮询服务器次数
    private int i = 0 ;

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

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

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

                        // 步骤3:采用Observable<...>形式 对 网络请求 进行封装
                        Observable<Translation> observable = request.getCall();

                        // 步骤4:发送网络请求 & 通过repeatWhen()进行轮询
                        observable.repeatWhen(new Function<Observable<Object>, ObservableSource<?>>() {
                            @Override
                            // 在Function函数中,必须对输入的 Observable<Object>进行处理,此处使用flatMap操作符接收上游的数据
                            public ObservableSource<?> apply(@NonNull Observable<Object> objectObservable) throws Exception {
                                // 将原始 Observable 停止发送事件的标识(Complete() /  Error())转换成1个 Object 类型数据传递给1个新被观察者(Observable)
                                // 以此决定是否重新订阅 & 发送原来的 Observable,即轮询
                                // 此处有2种情况:
                                // 1. 若返回1个Complete() /  Error()事件,则不重新订阅 & 发送原来的 Observable,即轮询结束
                                // 2. 若返回其余事件,则重新订阅 & 发送原来的 Observable,即继续轮询
                                return objectObservable.flatMap(new Function<Object, ObservableSource<?>>() {
                                    @Override
                                    public ObservableSource<?> apply(@NonNull Object throwable) throws Exception {

                                        // 加入判断条件:当轮询次数 = 5次后,就停止轮询
                                        if (i > 3) {
                                            // 此处选择发送onError事件以结束轮询,因为可触发下游观察者的onError()方法回调
                                            return Observable.error(new Throwable("轮询结束"));
                                        }
                                        // 若轮询次数<4次,则发送1Next事件以继续轮询
                                        // 注:此处加入了delay操作符,作用 = 延迟一段时间发送(此处设置 = 2s),以实现轮询间间隔设置
                                        return Observable.just(1).delay(2000, TimeUnit.MILLISECONDS);
                                    }
                                });

                            }
                        }).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() ;
                                        i++;
                                    }

                                    @Override
                                    public void onError(Throwable e) {
                                        // 获取轮询结束信息
                                        Log.d(TAG,  e.toString());
                                    }

                                    @Override
                                    public void onComplete() {

                                    }
                                });

                    }
    }

4.3 步骤实现

3.3 测试结果

示意图


步骤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"/>

4. Demo地址

Carson_Ho的Github地址 =
RxJava2实战系列:有标准化的轮询

有关无条件的网要轮询,具体求圈文章Android RxJava
实际利用讲解:网络要轮询


手续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() {
        System.out.println( "Rxjava翻译结果:" + status);
        System.out.println("Rxjava翻译结果:" + content.from);
        System.out.println("Rxjava翻译结果:" + content.to);
        System.out.println("Rxjava翻译结果:" + content.vendor);
        System.out.println("Rxjava翻译结果:" + content.out);
        System.out.println("Rxjava翻译结果:" + content.errNo);
    }
}

5. 总结

  • 正文主要教学了
    Rxjava创建操作符的实际支付需要状况:有规范轮询需求
    ,并结合RetrofitRxJava 实现
  • 脚我用做 实质上状况下 &
    Rxjava的系以框架(如RetrofitEventbus
    ,继续对
    AndroidRxjava 的其实支付需要状况进行深入讲解
    ,有趣味可以延续关心Carson_Ho的安卓开发笔记

手续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()是接受网络请求数据的方法
}

要点赞!因为您的砥砺是自家写的极度可怜动力!

系文章读

  • 操作符使用
    Android:这是均等篇 清晰 & 易懂的Rxjava
    入门教程
    Android RxJava:最基础的操作符详解 –
    创建操作符
    Android RxJava:图文详解
    变换操作符
    Android RxJava:组合 / 合并操作符
    详细教程
    Android RxJava:功能性操作符
    全面授课
  • 实则行使讲解
    Android RxJava
    实际用讲解:(无条件)网络要轮询
    Android RxJava
    实际应用讲解:(有原则)网络要轮询
    Android RxJava
    实际采用讲解:网络要嵌套回调
    Android RxJava
    实际行使讲解:合并数据源
    Android RxJava 实际使用讲解:从磁盘 / 内存缓存着
    获取缓存数据
    Android RxJava
    实际利用讲解:联合判断
    Android RxJava:细说 线程控制(切换 / 调度
    )(含Retrofit实例讲解)
    Android RxJava
    实际用讲解:网络要出错重连(结合Retrofit)

连接下的步子都于MainActivity.java外实现(请圈注释)

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Rxjava";

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

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

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

        // 步骤6:采用Observable<...>形式 对 网络请求 进行封装
        Observable<Translation> observable = request.getCall();

        // 步骤7:发送网络请求
        observable.subscribeOn(Schedulers.io())               // 在IO线程进行网络请求
                  .observeOn(AndroidSchedulers.mainThread())  // 回到主线程 处理请求结果
                  .subscribe(new Observer<Translation>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "开始采用subscribe连接");
                    }

                    @Override
                    public void onNext(Translation result) {
                        // 步骤8:对返回的数据进行处理
                        result.show() ;
                    }

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

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "请求成功");
                    }
                });
    }
}

迎接关注Carson_Ho的简书!

无期分享有关安卓开发的干货,追求短、平、快,但也未欠深度

4.4 测试结果

示意图

4.5 Demo地址

Carson_Ho的Github地址 =
Retrofit结合RxJava实战系列:基础运用


5. 实在付出需要案例

  • 下,我将下Retrofit &
    RxJava,并结合实际的开支需要状况进行案例之上书
  • 教的骨子里支出需要状况包括:

示意图

5.1 网络要轮询(无条件)

  • 需要状况说明

示意图

  • 切切实实贯彻
    切切实实要看文章:Android RxJava
    实际运用讲解:(无条件)网络要轮询

5.2 网路请求轮询(有原则)

  • 急需状况

示意图

  • 切切实实实现
    切切实实求看文章:Android RxJava
    实际利用讲解:(有标准)网络要轮询

5.3 网络要嵌套回调

  • 背景
    亟待展开嵌套网络要:即以第1单网要成功后,继续再开展同样软网络要

如 先进行 用户注册 的大网要, 待注册成功后转又累发送
用户登录 的网络要

  • 冲突
    嵌套实现网络要较为复杂,即嵌套调用函数

下面展示的凡组成 RetrofitRxJava的中心用法,即无用操作符前

// 发送注册网络请求的函数方法
    private void register() {
        api.register(new RegisterRequest())
                .subscribeOn(Schedulers.io())               //在IO线程进行网络请求
                .observeOn(AndroidSchedulers.mainThread())  //回到主线程去处理请求结果
                .subscribe(new Consumer<RegisterResponse>() {
                    @Override
                    public void accept(RegisterResponse registerResponse) throws Exception {
                        Toast.makeText(MainActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
                        login();   //注册成功, 调用登录的方法
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Toast.makeText(MainActivity.this, "注册失败", Toast.LENGTH_SHORT).show();
                    }
                });
    }


// 发送登录网络请求的函数方法
private void login() {
        api.login(new LoginRequest())
                .subscribeOn(Schedulers.io())               //在IO线程进行网络请求
                .observeOn(AndroidSchedulers.mainThread())  //回到主线程去处理请求结果
                .subscribe(new Consumer<LoginResponse>() {
                    @Override
                    public void accept(LoginResponse loginResponse) throws Exception {
                        Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
                    }
                });
    }
  • 化解方案
    结合 RxJava2屡遭之换操作符FlatMap()兑现嵌套网络要

  • 切实实现
    具体要圈文章:
    Android RxJava
    实际用讲解:网络要嵌套回调


5.4 网络要出错重连

  • 需状况
示意图
  • 力量需求说明

示意图

  • 效果逻辑

示意图

  • 切实落实
    具体求看文章:Android RxJava
    实际行使讲解:网络要出错重连(结合Retrofit)

5.5 合并数据源 & 统一显示

  • 急需状况

示意图

  • 功能说明
    就是,同时为2独服务器发送网络要 ->> 获取数据 ->>
    合并数据 ->> 统一展示及客户端

  • 切切实实落实
    切切实实要圈文章:Android RxJava
    实际利用讲解:合并数据源

至此,关于Retrofit & RxJava的实际开发需要状况讲解了。


6. Demo地址

上述所有案例的源代码都存放于:Carson_Ho的Github地址 =
Retrofit结合RxJava实战系列


7. 总结

  • 正文主要教授了Retrofit & RxJava的构成使用 & 实际开发需要实现
  • 下,我以继续深入讲解 Rxjava 的其它实际支出需求场景
    (结合相关框架,如RxBindingEventbus),有趣味可以继承关注Carson_Ho的安卓开发笔记

央点赞!因为您的砥砺是自家作之无比老动力!

连带文章读

  • 操作符使用
    Android:这是均等首 清晰 & 易懂的Rxjava
    入门教程
    Android RxJava:最基础之操作符详解 –
    创建操作符
    Android RxJava:图文详解
    变换操作符
    Android RxJava:组合 / 合并操作符
    详细教程
    Android RxJava:功能性操作符
    全面授课
  • 实际行使讲解
    Android RxJava
    实际使用讲解:(无条件)网络要轮询
    Android RxJava
    实际应用讲解:(有格)网络要轮询
    Android RxJava
    实际采用讲解:网络要嵌套回调
    Android RxJava
    实际行使讲解:合并数据源
    Android RxJava 实际用讲解:从磁盘 / 内存缓存着
    获取缓存数据
    Android RxJava
    实际应用讲解:联合判断
    Android RxJava:细说 线程控制(切换 / 调度
    )(含Retrofit实例讲解)
    Android RxJava
    实际行使讲解:网络要出错重连(结合Retrofit)

迎关注Carson_Ho的简书!

切莫定期分享有关安卓开发的干货,追求短、平、快,但倒无短深度

相关文章