V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ilumer
V2EX  ›  Android

如何使用 RxJava 中的 subject。

  •  
  •   ilumer · 2016-11-03 17:09:50 +08:00 · 8831 次点击
    这是一个创建于 2944 天前的主题,其中的信息可能已经有所发展或是发生改变。

    绝大部分的文章都在和你讲如何使用Rxjava中的各种操作符或者是与Rxjava与 MVP 以及retrofit的使用。但是却很有文章介绍如何使用它(除去Rxbus),看到的都是如何吐槽它很危险的。请问应该如何合理的使用。

    第 1 条附言  ·  2016-11-12 11:12:34 +08:00

    自己前几天有好好的看了一下subject。热信号难以预估数据的发射,但是可以实现多播以及处理backpressure(这部分我没有理解)。https://github.com/mohit222cool/Rx-Subjects

    4 条回复    2016-11-04 10:38:56 +08:00
    pwcong
        1
    pwcong  
       2016-11-03 19:38:00 +08:00
    我也只是处于简单使用阶段,比如在下载啊读取啊需要异步防阻塞的时候用,例如我的一个小项目的一段:

    ```
    Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {

    subscriber.onStart();
    subscriber.onNext(ResourceUtils.getString(SplashActivity.this,R.string.loading_data));
    DBManager.getInstance().init();
    SoundPoolManager.getInstance().init();
    GifManager.getInstance().init();
    subscriber.onNext(ResourceUtils.getString(SplashActivity.this,R.string.loading_data_success));
    subscriber.onCompleted();

    }
    })
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Subscriber<String>() {
    @Override
    public void onCompleted() {

    startActivity(new Intent(SplashActivity.this,MainActivity.class));
    finish();
    }

    @Override
    public void onError(Throwable e) {
    mTextView.setText(ResourceUtils.getString(SplashActivity.this,R.string.loading_data_error));
    }

    @Override
    public void onNext(String s) {
    mTextView.setText(s);
    }
    });
    ```
    KNOX
        2
    KNOX  
       2016-11-03 19:53:51 +08:00
    怎么危险了?想用好 RxJava 当然是看官方 wiki 。
    coa
        3
    coa  
       2016-11-04 01:20:18 +08:00   ❤️ 1
    Android 的不清楚,但猜想 FRP 概念上各语言应该通用。

    iOS 下使用 ReactiveCocoa 也有一个 RACSubject , RACSubject 被警告比较危险是因为它既可以被订阅,也可以充当订阅者,自由度比较大,不好把控。 RACSubject 会维护一个 Subscriber 列表,每当有 Subscriber 对其订阅时,就会把它添加到列表中(可以被订阅)。同时一旦有人向其 sendNext ,之前添加到列表中的所有订阅者都会取得该值(实现了 RACSubscriber 协议,可以充当订阅者)。

    打个比方,现在有个 tableView ,初始化时进行订阅,绑定好需要的操作,然后在点击 Cell 时把值 send 过去,绑定好的操作就能收到该值开始运作。配合 MVVM 使用的话看起来结构会十分清晰,耦合度相当低。
    crashX
        4
    crashX  
       2016-11-04 10:38:56 +08:00
    subject 是热信号,一般是使用者定义的。不到万不得已不建议用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   995 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 21:17 · PVG 05:17 · LAX 13:17 · JFK 16:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.