greenrobot / ObjectBoxRxJava

Optional RxJava 2 APIs for ObjectBox
Apache License 2.0
71 stars 8 forks source link

'io.objectbox.reactive.DataSubscription.cancel()' on a null object reference #5

Closed Ivolian closed 6 years ago

Ivolian commented 6 years ago
           java.lang.NullPointerException: Attempt to invoke interface method 'void io.objectbox.reactive.DataSubscription.cancel()' on a null object reference
                  at io.objectbox.query.QueryPublisher.unsubscribe(QueryPublisher.java:89)
                  at io.objectbox.reactive.DataSubscriptionImpl.cancel(DataSubscriptionImpl.java:21)
                  at io.objectbox.rx.RxQuery$5$2.cancel(RxQuery.java:127)
                  at io.reactivex.internal.disposables.CancellableDisposable.dispose(CancellableDisposable.java:49)
                  at io.reactivex.internal.disposables.DisposableHelper.set(DisposableHelper.java:54)
                  at io.reactivex.internal.operators.single.SingleCreate$Emitter.setDisposable(SingleCreate.java:109)
                  at io.reactivex.internal.operators.single.SingleCreate$Emitter.setCancellable(SingleCreate.java:114)
                  at io.objectbox.rx.RxQuery$5.subscribe(RxQuery.java:124)
                  at io.reactivex.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:39)
                  at io.reactivex.Single.subscribe(Single.java:2707)
                  at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
                  at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
                  at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
                  at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
                  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                  at java.lang.Thread.run(Thread.java:761)

@Override
public synchronized void unsubscribe(DataObserver<List<T>> observer, @Nullable Object param) {
    DataPublisherUtils.removeObserverFromCopyOnWriteSet(observers, observer);
    if (observers.isEmpty()) {
        objectClassSubscription.cancel();  // this line
        objectClassSubscription = null;
    }
}

subscribe method in QueryPublisher never call  when i use Single , so objectClassSubscription  be null

override fun get(): Single<List<Airport>> = RxQuery.single(box.query()
        .equal(Airport_.deleted, 0)
        .build())

when using Observable instead of Single, all be right

    if(single) {
        if(onlyChanges) {
            throw new IllegalStateException("Illegal combination of single() and onlyChanges()");
        }
        publisher.publishSingle(observer, publisherParam);
    } else {
        publisher.subscribe(observer, publisherParam);
        if(!onlyChanges) {
            publisher.publishSingle(observer, publisherParam);
        }
    }
louis993546 commented 6 years ago

It's been almost 6 months. Any updates?

greenrobot-team commented 6 years ago

Duplicate of #7. Please re-open if that is not the case. -ut