如何从头开始创建我自己的热Observable?
我想创建自己的函数,返回可观察的,返回的位置:
public static Observable<Location> locationObservable(Context context, String provider, long minTime, float minDistance) {
这适用于Android。建议您为此目的使用Observable.create()
,但为每个订阅者example shows just passing constant list of integers使用{{3}}。
如果我在这里做其他事情,例如,记住一个订阅者列表,那么我将如何实现取消订阅和许多其他功能?
即。绝对不知道在Observable.OnSubscribe<Integer>()
实施中该做什么?
答案 0 :(得分:1)
通常要创建热观察,您可以使用某种Subject
:PublishSubject
,BehaviorSubject
等。
查看BehaviorSubject
here的示例。
class LocationService {
private Subject<Location> subject = BehaviorSubject.create();
Observable<Location> locationObservable(...) {
return subject;
}
void onNewLocationListener(Location newLocation) {
subject.onNext(newLocation);
}
}
答案 1 :(得分:1)
不建议您自己编写,至少在您熟悉现有版本并且需要默认5(异步,行为,发布,重播,单播)未涵盖的特殊缓存/发射模式之前。
如果你真的想要的话,我有一个关于这个主题的3部分系列(双关语):
答案 2 :(得分:0)
看看这个直接来自Realm的RealmObservableFactory
:
@Override
public Observable<Realm> from(Realm realm) {
final RealmConfiguration realmConfig = realm.getConfiguration();
return Observable.create(new Observable.OnSubscribe<Realm>() { // create new observable
@Override
public void call(final Subscriber<? super Realm> subscriber) { // this is executed on `subscribeOn(Scheduler)`
final Realm observableRealm = Realm.getInstance(realmConfig);
final RealmChangeListener<Realm> listener = new RealmChangeListener<Realm>() {
@Override
public void onChange(Realm realm) {
if (!subscriber.isUnsubscribed()) { // always check if subscriber is unsubscribed!
subscriber.onNext(observableRealm);
}
}
};
subscriber.add(Subscriptions.create(new Action0() { // add unsubscription first! thread specified by unsubscribeOn(Scheduler)
@Override
public void call() {
observableRealm.removeChangeListener(listener); // remove listener
observableRealm.close();
}
}));
observableRealm.addChangeListener(listener); // add listener
subscriber.onNext(observableRealm); // initial value
}
});
}
阅读评论,这是一个很好的例子。