1.Observable.subscribe(Subscriber)
的内部实现是这样的(仅核心代码):
public Subscription subscribe(Subscriber subscriber)
{
subscriber.onStart();
onSubscribe.call(subscriber);
return subscriber;
}
可以看到,subscriber()
做了3件事:
- 调用
Subscriber.onStart()
。这个方法是一个可选的准备方法。 - 调用
Observable
中的OnSubscribe.call(Subscriber)
。在这里,事件发送的逻辑开始运行。从这也可以看出,在 RxJava 中,Observable
并不是在创建的时候就立即开始发送事件,而是在它被订阅的时候,即当subscribe()
方法执行的时候。 - 将传入的
Subscriber
作为Subscription
返回。这是为了方便unsubscribe()
. - 创建一个Observable,这可以使用 Observable.create() 方法来做到:
-
接下来,当 button 被点击时,我们需要给我们的 Observable 做订阅。我添加了一个新的 button 用 RxJava 版本来处理我们的任务。final Observable operationObservable = Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { subscriber.onNext(longRunningOperation()); subscriber.onCompleted(); } });
-
备注:在我们的 Observable 去订阅之前,我们的操作是不会被调用的!也就是说当点击按钮,调用subscribe()方法之后,我们的所有方法才会被调用!(数据流开始流动)startRxOperationButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { v.setEnabled(false); operationObservable.subscribe(new Subscriber() { @Override public void onCompleted() { v.setEnabled(true); } @Override public void onError(Throwable e) {} @Override public void onNext(String value) { Snackbar.make(rootView, value, Snackbar.LENGTH_LONG).show(); } }); } });