如何使用 RxJava 中的 subject。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
ilumer

如何使用 RxJava 中的 subject。

  •  
  •   ilumer Nov 3, 2016 12782 views
    This topic created in 3461 days ago, the information mentioned may be changed or developed.

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

    Supplement 1    Nov 12, 2016

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

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

    ```
    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  
       Nov 3, 2016
    怎么危险了?想用好 RxJava 当然是看官方 wiki 。
    coa
        3
    coa  
       Nov 4, 2016   1
    Android 的不清楚,但猜想 FRP 概念上各语言应该通用。

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

    打个比方,现在有个 tableView ,初始化时进行订阅,绑定好需要的操作,然后在点击 Cell 时把值 send 过去,绑定好的操作就能收到该值开始运作。配合 MVVM 使用的话看起来结构会十分清晰,耦合度相当低。
    crashX
        4
    crashX  
       Nov 4, 2016
    subject 是热信号,一般是使用者定义的。不到万不得已不建议用。
    About     Help     Advertise     Blog     API     FAQ     Solana     905 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 22:26 PVG 06:26 LAX 15:26 JFK 18:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86