更贴切的RxJava的入门

怎么满GitHub的开源项目都是基于RxJava?

最近为了提升自己对代码的理解与阅读能力,在github上面搜索了最近比较火的开源框架,找到地址往下翻后总会看到这样一段话:
网络请求:RxJava & Retrofit+okhttp
这个RxJava和Retrofit是个啥东西?听都没听说过。
懵逼的我马上Google了一下通过一段时间的学习和运用基本有了对其的一些个人理解
明白了为何他们会是现在非常好的网络请求框架广且受开发者们的青睐
下面结合我自己的浅见,向大家分享一下我对这门新技术的理解


什么是RxJava,为什么大家都用他呢

对于我个人而言,RxJava在整个网络框架中担任着异步这一重要的任务,
Retrofit则扮演向服务端请求数据这一角色
同时异步任务它必定有着AsyncTask和Handler不具备的优点
在经过一系列的项目实践之后这个优点更加明显
- 在不断复杂的逻辑之中,它依旧能出淤泥而不染-保持代码的可读性简洁性
Observable.from()
.flatMap(….)
.filter(……)
.map(…)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe
它至上而下为一种链式调用,非常便于我们开发者理解,在逻辑复杂的环境中更加凸显
-响应式编程
安卓中的点击监听器,View在被点击的一瞬间响应事件
客户端在得到服务端返回数据的一瞬间响应操作


在运用之前RxJava你需要掌握

观察者模式

对,就是我们耳熟能祥的设计模式之一———-观察者模式
这里我会以图片的形式重现这一模式,帮助大家理解这种机制的原理
我一直认为代码来源于生活,虽然有一些不贴切,希望大家谅解指正
观察者模式图解

我这里模拟的是前几年经常出现的碰瓷事件(有些不恰当)
那么这个事件中当然有主角和配角
主角-老奶奶 Observable被观察者
配角-围观群众 Observer观察者
-Action-
老奶奶在路上散步
围观群众一直盯着这个老奶奶(高度敏感的监视)看觉得不对劲,走路晃悠悠的
但没人上前询问情况,这时老奶奶在开过来的一辆车接近一米前突然就倒下了
(发生了onPengCi())这时围观群众(反应)有的拿手机拍照(takePhoto()),有的信以为真打电话给警察(callPolice())有的远离现场
-Cut-
这时场景结束了
想必你大约能理解观察者模式的本质了—–对,就是回调
在敏感监视的过程中当被观察者做出动作,这个事件观察者会马上接收到并调用相应的方法

但在上述场景中,你肯定会注意到下面这些细节
1.高度敏感
2.观察者吝啬的活动

这两点便是RxJava所针对此模式所扩展的地方

订阅者模式(扩展的观察者模式,个人见解莫怪)

二话不说,上图
订阅者模式
熟悉的场景再一次显现
这里的不同之处在于
老奶奶倒地之后打了个电话给他儿子(通知观察者)
围观群众里有这时站出来一个人正是他儿子
因为之前与老奶奶商量(签订协议)敲诈这车主一波
他马上上前说老奶奶受伤严重索要赔偿

这里的不同之处,想必大家都明白了
这里以一种注册订阅的理念,取代了繁琐的监视操作更加灵活
能够以响应的姿态使订阅者进入角色
而订阅者的活动更加丰富具体,演技更加到位


RxJava基本使用

在使用之前希望大家能知道下面的基本概念

  • Observer观察者
  • Subscriber订阅者
  • Observable被观察者
  • Scheduler调度器

RxJava的subscribe过程中,Observer 总是会先被转换成一个Subscriber再使用
所以其中都是基于订阅机制实现的

前三个想必大家都知晓了,那么最后一个呢?
Schaeduler调度器,他相当于安卓中的线程控制器
默认RxJava中遵循的是线程不变的原则
即:
在哪个线程调用 subscribe(),就在哪个线程生产事件;
在哪个线程生产事件,就在哪个线程消费事件。

但如果需要切换线程,就需要用到 Scheduler (调度器)。
线程的分类:
Schedulers.immediate()当前线程
Schedulers.newThread()新开线程
Schedulers.io()IO线程 读写文件数据库,请求网络
Schedulers.computation()密集型计算专用
AndroidSchedulers.mainThread()主线程

线程的控制:
subscribeOn() 和 observeOn()
- subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。
- observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。

至此,到了代码阶段,让我们一起实现RxJava最简单的实现吧!

上代码

//1.创建订阅者
Subscriber<String> subscriber = new Subscriber<String>() {
  @Override
    public void onNext(String s) {
        Log.d(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.d(tag, "Completed!");
    }

    @Override
    public void onError(Throwable e) {
        Log.d(tag, "Error!");
    }
};
//2.创建被观察者
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {//传入跟他订阅关系的订阅者
      //被订阅时候调用
        subscriber.onNext("Hello");
        subscriber.onNext("Hi");
        subscriber.onNext("Aloha");
        subscriber.onCompleted();
    }
});
//3.签订契约吧少年
observable.subscribe(subscriber);

当订阅之后就会执行被观察者的call方法再回调观察者的实现
这样我们最简单的RxJava用法就完成了!


最后

对于 Android 开发者来说, RxJava 是一个很难上手的库,对于Android新手来说,他更是难以理解,因此我写这篇文章是结合我们的生活来讲述代码,让大家都能听得懂,能给大家一些入门的指引,当然这只是我个人的浅见登不上大雅之堂,无论如何,只要能给各位同为 Android 工程师的你们提供一些帮助,这篇文章的目的就达到了。


关于作者

陈鸿(大四在校学生,目前寻找实习中)
QQ:568261070
GitHub:https://github.com/MrCodeSniper

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值