给android开发者使用rxjava的7个建议

原文地址:http://futurice.com/blog/top-7-tips-for-rxjava-on-android
翻译:brzhang
翻译水准:并非一字一句翻译。

文章的背景

作者介绍了一段经历,话说他们做了一个大胆的尝试,将他们的android架构使用rxjava重构,结果,遇到了一些问题,大概就是从之前的null pointer 变成了现在的线程问题,然而作者当时也陷入了困境,发现遇到问题了,stackover也似乎帮不上什么忙,但经过几个月的努力,他们依然成功了,重构出了一个可测试性比较好的框架,所以才有了这篇文字吧,总之,虽然说rxjava上手难度是有的,但非常值得试一试!

预备知识

首先看一下这个Observer-Operation-Subscriber(我个人认为应该说成是Observable-Operation-Subscriber) 链:

Paste_Image.png

比较简单,它表示发送了一个整形5,经过一个Operation 为+2的操作,最后发送7给Subscriber,实际上也是(Observer),要注意这个过程是异步的,也就是说subscriber并不知道原始的那个5已经被加工运算过,其实它认为Observable发送给他的就是7。如果你对函数式编程的概念不了解,那么这里有一篇文章是给你,
a wide-spread post about Rx

那么接下来的,将是本文的重点了,也就是rxjava的七个建议。

  • 1. 记住!!rxjava默认是同步的
    也就是说,线程切换交给你来处理。
  • 2. 热冷subscriptions
    通常observables在没有被订阅的时候,称之为冷subscription,是不会执行onSubscribe方法的,只有被订阅之后,才热了,才会执行onSubscribe,以及系列的operation。比如,这个就是冷subscription
    Paste_Image.png

    亦比如 ,这两个是热subscription了。
Paste_Image.png

然而,还有更加重要的一点,那就是一个observable是可以被多次订阅的,这是因为,onSubscribe方法会为每个subscriber去独立的执行。那么有没有什么办法保证subscriber接收到其他的subscriber接收过的数据,答案显然是有的,那就是

  • cache
    cache用以下图表示在适合不过了,实际上我是这么理解的,cache有点类似做了一个中间的订阅者subscriber,然后同时它自己又是一个observable,可以给后续的subscriber订阅。


    Paste_Image.png

作者这里给出了一个应用cache的例子self-contained example

  • 3. 当遇到麻烦的时候,不妨考虑使用subjects
    作者把subjects当做是最后的杀手锏,subjects在适当的时候可以是一个observable,在适当的时候,它又可以是一个subscriber,了解了它,你也就了解了rx的原理,甚至可以用它来处理一些棘手的问题,其中PublishSubject就是一个使用最广泛的家伙,实际上,事件总线比如otto就可以用PublishSubject取代,如果你不明白怎么去做,这里有一个例子:
    RxBus
  • 4. 时刻关注线程问题
    当你需要为observable做部分异步操作的时候,你不得不去关注这个概念,这里只需要你记住一点,耗时操作,比如网络不应该放在ui线程,更新ui线程操作不应该丢在非ui线程。然而关于取消订阅,这个可能是rx需要改进的一点,那就是用户自己写的Observable在onSubscribe方法没有被执行完之前,是不能被取消订阅的,因此这个地方是可能存在性能瓶颈的。

  • **5 . 没有什么比官方文档更靠谱的了,有丰富的图表 **

这里是官方文档.

  • 6. 订阅的多种方式
    我比较懒,都是写成
.subscribe(new Subscriber<QueryMatchResponse>() {
    @Override
    public void onCompleted() {
      
    }

    @Override
    public void onError(Throwable e) {
   
    }

    @Override
    public void onNext(QueryMatchResponse response) {
        
    }
});

个人觉得,这个地方没有必要太较真。

  • 7. 时刻注意内存泄露
    rx也不是万能的,使用不当,依然会有内存泄露,你在obserable中使用了context吧,当然我一提你就知道,这个时候是用应用context还是使用ui及context,内存泄露说解决也很好解决,关键点就在于,你的activity或者fragment要被回收的时候,是否有人还强引用着它,如果有,那抱歉,你泄露了,如果不存在,OK,他回收成功,不存在泄露。

作者最后总结,如果你想使用rxjava构建一个android框架,可以参考他的这个示例,这当然是一顿相当不错的午餐咯
rx-android-architecture

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容