如何从头开始创建我自己的热Observable?

时间:2017-01-25 15:28:50

标签: java rx-java

如何从头开始创建我自己的热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>()实施中该做什么?

3 个答案:

答案 0 :(得分:1)

通常要创建热观察,您可以使用某种SubjectPublishSubjectBehaviorSubject等。

查看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
        }
    });
}

阅读评论,这是一个很好的例子。