是的,一旦学会了,这很棒。考虑以下单例类:
public class UsernameModel {
private static UsernameModel instance;
private PublishSubject<String> subject = PublishSubject.create();
public static UsernameModel instanceOf() {
if (instance == null) {
instance = new UsernameModel();
}
return instance;
}
/**
* Pass a String down to event listeners.
*/
public void setString(String string) {
subject.onNext(string);
}
/**
* Subscribe to this Observable. On event, do something e.g. replace a fragment
*/
public Observable<String> getStringObservable() {
return subject;
}
}
在您的Activity中,请准备接收事件(例如,在onCreate中添加该功能):UsernameModel usernameModel = UsernameModel.instanceOf();
//be sure to unsubscribe somewhere when activity is "dying" e.g. onDestroy
subscription = usernameModel.getStringObservable()
.subscribe(s -> {
// Do on new string event e.g. replace fragment here
}, throwable -> {
// Normally no error will happen here based on this example.
});
在您的片段中,当事件发生时将其传递下去:UsernameModel.instanceOf().setString("Nick");
您的活动将会执行某些操作。
提示1:使用任何您喜欢的对象类型来更改字符串。
提示2:如果您有依赖注入,它也可以很好地工作。
更新:我撰写了一篇更详细的文章
目前我认为对于这个问题,我更倾向于:
1.) 不使用一个全局总线来处理整个应用程序中的所有内容(可能会变得非常笨拙),而是使用“本地”总线来清晰定义目的,并仅在需要时将其插入。
例如,您可能会有:
Activity
和ApiService
之间发送数据。Activity
中多个Fragment
之间通信。Activity
发送当前选择的应用程序主题颜色,以便它们可以相应地调整所有图标的色调。2.) 使用Dagger(或者如果您更喜欢的话,也可以使用AndroidAnnotations)使连接一切变得不那么痛苦(并且避免了许多static
实例)。这也使得更容易,例如:只有一个组件专门处理在SharedPreferences
中存储和读取登录状态——然后该组件可以直接与您的ApiService
连接,为所有请求提供会话令牌。
3.) 内部可以自由使用Subject
,但在通过调用return subject.asObservable()
将其传递给公众之前,请将其“转换”为Observable
。这可以防止其他类将值推入Subject
中,而它们不应该被允许。
public class Trigger {
public Trigger() {
}
public static class Increment {
}
public static class Decrement {
}
public static class Reset {
}
}
public class RxTrigger {
private PublishSubject<Object> mRxTrigger = PublishSubject.create();
public RxTrigger() {
// required
}
public void send(Object o) {
mRxTrigger.onNext(o);
}
public Observable<Object> toObservable() {
return mRxTrigger;
}
// check for available events
public boolean hasObservers() {
return mRxTrigger.hasObservers();
}
}
Application.class
public class App extends Application {
private RxTrigger rxTrigger;
public App getApp() {
return (App) getApplicationContext();
}
@Override
public void onCreate() {
super.onCreate();
rxTrigger = new RxTrigger();
}
public RxTrigger reactiveTrigger() {
return rxTrigger;
}
}
MyApplication mApp = (App) getApplicationContext();
mApp
.reactiveTrigger() // singleton object of trigger
.toObservable()
.subscribeOn(Schedulers.io()) // push to io thread
.observeOn(AndroidSchedulers.mainThread()) // listen calls on main thread
.subscribe(object -> { //receive events here
if (object instanceof Trigger.Increment) {
fabCounter.setText(String.valueOf(Integer.parseInt(fabCounter.getText().toString()) + 1));
} else if (object instanceof Trigger.Decrement) {
if (Integer.parseInt(fabCounter.getText().toString()) != 0)
fabCounter.setText(String.valueOf(Integer.parseInt(fabCounter.getText().toString()) - 1));
} else if (object instanceof Trigger.Reset) {
fabCounter.setText("0");
}
});
MyApplication mApp = (App) getApplicationContext();
//increment
mApp
.reactiveTrigger()
.send(new Trigger.Increment());
//decrement
mApp
.reactiveTrigger()
.send(new Trigger.Decrement());
以上库的完整实现示例 -> RxTrigger
subscribeOn(Schedulers.io())
的目的是什么? - Piotr Aleksander Chmielowski