Подтвердить что ты не робот

Наблюдаемый, который ничего не пропускает в onNext()

Мне понадобится Observable, например, чтобы обеспечить системные часы, которым не нужно ничего пропускать в onNext(). Я не мог найти подпись, которая позволила бы мне это сделать.

Конечно, я мог бы использовать любой объект, а затем передать null, но это не имеет большого смысла. Поэтому мой вопрос в том, есть ли лучший способ сделать это.

Observable.create(new Observable.OnSubscribe<Anyobject>() { // use any object in the signature

            @Override public void call(Subscriber<? super Anyobject> subscriber) {

                    subscriber.onNext(null); // then pass null
                    subscriber.onCompleted();

            }

        })
4b9b3361

Ответ 1

Вам не нужно вызывать onNext, если ваш Observable ничего не испускает. Вы можете использовать Void в своей подписи и сделать что-то вроде

Observable<Void> o = Observable.create(new Observable.OnSubscribe<Void>() {
    @Override
    public void call(Subscriber<? super Void> subscriber) {
        // Do the work and call onCompleted when you done,
        // no need to call onNext if you have nothing to emit
        subscriber.onCompleted();
    }
});

o.subscribe(new OnCompletedObserver<Void>() {
    @Override
    public void onCompleted() {
        System.out.println("onCompleted");
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("onError " + e.getMessage());
    }
});

Вы можете определить OnCompletedObserver, чтобы упростить обратный вызов Observer, чтобы вам не пришлось переопределять onNext, поскольку он вам не нужен.

public abstract class OnCompletedObserver<T> implements Observer<T> {
    @Override
    public void onNext(T o) {

    }
}

Если я понял, что вы просите, тогда это должно сделать трюк.

Ответ 2

Если вам нужно что-то передать в onNext() до вызова onCompleted():

Observable.<Void>just(null)

Если вам нужно только onCompleted() для вызова:

Observable.empty()