RxJava 线程切换
RxJava Thread switching
RxBottomNavigationView.itemSelections(sections).map(menuItem -> menuItem.getTitle().toString())
.observeOn(AndroidSchedulers.mainThread()).map(this::insertCategoryHeadersForSection)
.subscribeOn(Schedulers.computation()).observeOn(AndroidSchedulers.mainThread())
.compose(bindToLifecycle()).subscribe(itemInfos -> dishRecyclerAdapter.animateTo(itemInfos));
上面的代码抛出这个异常:
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:111)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean io.reactivex.internal.fuseable.SimpleQueue.isEmpty()' on a null object reference
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
我正在尝试从 BottomNavigationView 获取 itemSelections 事件,然后将项目映射到它的标题(在主线程上),然后 运行 在后台线程上进行长时间操作,然后接收输出再次在主线程上进行该操作。请帮忙。提前致谢。
您 运行 进入了一个 bug in RxBinding2 ,它已在存储库中修复但尚未发布。原因是通过使用 subscribeOn(Schedulers.computation())
你不会将计算移到后台,而是让 RxBottomNavigationView.itemSelections(sections)
发生在后台线程上,这是被禁止的并且会导致你的流(和应用程序)崩溃。
你应该这样做:
RxBottomNavigationView.itemSelections(sections)
.subscribeOn(AndroidSchedulers.mainThread()) // <------------------------
.map(menuItem -> menuItem.getTitle().toString()) // main thread
.observeOn(Schedulers.computation()) // <------------------------
.map(this::insertCategoryHeadersForSection) // background
.observeOn(AndroidSchedulers.mainThread()) // <------------------------
.compose(bindToLifecycle())
.subscribe(itemInfos -> // main
dishRecyclerAdapter.animateTo(itemInfos));
RxBottomNavigationView.itemSelections(sections).map(menuItem -> menuItem.getTitle().toString())
.observeOn(AndroidSchedulers.mainThread()).map(this::insertCategoryHeadersForSection)
.subscribeOn(Schedulers.computation()).observeOn(AndroidSchedulers.mainThread())
.compose(bindToLifecycle()).subscribe(itemInfos -> dishRecyclerAdapter.animateTo(itemInfos));
上面的代码抛出这个异常:
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:111)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean io.reactivex.internal.fuseable.SimpleQueue.isEmpty()' on a null object reference
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
我正在尝试从 BottomNavigationView 获取 itemSelections 事件,然后将项目映射到它的标题(在主线程上),然后 运行 在后台线程上进行长时间操作,然后接收输出再次在主线程上进行该操作。请帮忙。提前致谢。
您 运行 进入了一个 bug in RxBinding2 ,它已在存储库中修复但尚未发布。原因是通过使用 subscribeOn(Schedulers.computation())
你不会将计算移到后台,而是让 RxBottomNavigationView.itemSelections(sections)
发生在后台线程上,这是被禁止的并且会导致你的流(和应用程序)崩溃。
你应该这样做:
RxBottomNavigationView.itemSelections(sections)
.subscribeOn(AndroidSchedulers.mainThread()) // <------------------------
.map(menuItem -> menuItem.getTitle().toString()) // main thread
.observeOn(Schedulers.computation()) // <------------------------
.map(this::insertCategoryHeadersForSection) // background
.observeOn(AndroidSchedulers.mainThread()) // <------------------------
.compose(bindToLifecycle())
.subscribe(itemInfos -> // main
dishRecyclerAdapter.animateTo(itemInfos));