如何使用 RxJava 中的 subject。

2016-11-03 17:09:50 +08:00
 ilumer

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

9390 次点击
所在节点    Android
4 条回复
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
2016-11-03 19:53:51 +08:00
怎么危险了?想用好 RxJava 当然是看官方 wiki 。
coa
2016-11-04 01:20:18 +08:00
Android 的不清楚,但猜想 FRP 概念上各语言应该通用。

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

打个比方,现在有个 tableView ,初始化时进行订阅,绑定好需要的操作,然后在点击 Cell 时把值 send 过去,绑定好的操作就能收到该值开始运作。配合 MVVM 使用的话看起来结构会十分清晰,耦合度相当低。
crashX
2016-11-04 10:38:56 +08:00
subject 是热信号,一般是使用者定义的。不到万不得已不建议用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/317798

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX