realm / realm-java

Realm is a mobile database: a replacement for SQLite & ORMs
http://realm.io
Apache License 2.0
11.45k stars 1.75k forks source link

Crash in rxJavaExample #5659

Open myproject opened 6 years ago

myproject commented 6 years ago

clone Latest Realm Examples and Run rxJavaExample -> ANIMATION activity.

just wait for about 2-3 minutes ,then Crash:

io.realm.examples.rxjava E/AndroidRuntime: FATAL EXCEPTION: RxComputationThreadPool-1
                                                                      Process: io.realm.examples.rxjava, PID: 14058
                                                                      java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.
                                                                          at io.realm.BaseRealm.checkIfValid(BaseRealm.java:426)
                                                                          at io.realm.RealmResults.checkForAddRemoveListener(RealmResults.java:220)
                                                                          at io.realm.RealmResults.removeChangeListener(RealmResults.java:244)
                                                                          at io.realm.rx.RealmObservableFactory$6$2.run(RealmObservableFactory.java:171)
                                                                          at io.reactivex.disposables.RunnableDisposable.onDisposed(RunnableDisposable.java:30)
                                                                          at io.reactivex.disposables.RunnableDisposable.onDisposed(RunnableDisposable.java:20)
                                                                          at io.reactivex.disposables.ReferenceDisposable.dispose(ReferenceDisposable.java:43)
                                                                          at io.reactivex.internal.disposables.DisposableHelper.dispose(DisposableHelper.java:125)
                                                                          at io.reactivex.internal.disposables.SequentialDisposable.dispose(SequentialDisposable.java:73)
                                                                          at io.reactivex.internal.operators.flowable.FlowableCreate$BaseEmitter.cancel(FlowableCreate.java:276)
                                                                          at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.cancel(FlowableFlatMap.java:353)
                                                                          at io.reactivex.internal.subscriptions.SubscriptionHelper.cancel(SubscriptionHelper.java:189)
                                                                          at io.reactivex.internal.operators.flowable.FlowableZip$ZipSubscriber.cancel(FlowableZip.java:399)
                                                                          at io.reactivex.internal.operators.flowable.FlowableZip$ZipCoordinator.cancelAll(FlowableZip.java:159)
                                                                          at io.reactivex.internal.operators.flowable.FlowableZip$ZipCoordinator.drain(FlowableZip.java:188)
                                                                          at io.reactivex.internal.operators.flowable.FlowableZip$ZipCoordinator.error(FlowableZip.java:151)
                                                                          at io.reactivex.internal.operators.flowable.FlowableZip$ZipSubscriber.onError(FlowableZip.java:388)
                                                                          at io.reactivex.internal.operators.flowable.FlowableInterval$IntervalSubscriber.run(FlowableInterval.java:87)
                                                                          at io.reactivex.internal.schedulers.ScheduledDirectPeriodicTask.run(ScheduledDirectPeriodicTask.java:39)
                                                                          at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
                                                                          at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:278)
                                                                          at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:273)
                                                                          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)
Zhuinden commented 6 years ago

I guess

.zipWith(Flowable.interval(1, TimeUnit.SECONDS), (person, tick) -> person)

Changes the unsubscribe thread to RxComputation scheduler.

Adding subscribeOn(AndroidSchedulers.mainThread()).unsubscribeOn(AndroidSchedulers.mainThread()) after asFlowable() would fix it.

myproject commented 6 years ago

@Zhuinden thank you. It works! And add onError handling or BackpressureStrategy better!

cmelchior commented 6 years ago

Ups. Yes, we should fix that.