rx-java2 - RxJava io.reactivex.exceptions.OnErrorNotImplementedException:必须从片段主机的主线程调用
问题描述
我对 RxJava 中的线程处理有点困惑。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.btn);
clickObservable = RxView.clicks(button);
vpPager = findViewById(R.id.vpPager);
adapterViewPager = new MyPagerAdapter(getSupportFragmentManager());
vpPager.setAdapter(adapterViewPager);
//debouncebale button.
disposable = clickObservable
.debounce(2000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
//This prints main thread.
Log.d(TAG, " o " + o + " thread " + Thread.currentThread().getName());
vpPager.setCurrentItem(vpPager.getCurrentItem() + 1, true);
}
});
pageChangedObservable = RxViewPager.pageSelections(vpPager);
pageChangedObservable
.observeOn(AndroidSchedulers.mainThread())
.delay(2000, TimeUnit.MILLISECONDS)
.subscribe(new Consumer<Integer>() {
@Override
public void accept(final Integer integer) throws Exception {
//This prints Thread RxComputationThreadPool-1
Log.d(TAG, "Thread " + Thread.currentThread().getName());
vpPager.setCurrentItem(integer + 1, true);
}
});
}
第一个 Log 语句打印主线程,第二个 Log 语句打印 RxComputationThreadPool-1。我不确定为什么。
解决方案
请注意,某些运算符在指定的 default 上运行,特别是与时间偏移有关Scheduler
的运算符(例如在本例中)。delay
否则,如果没有Scheduler
指定,它们将在生成下一个发射之前等待主线程。
如果您检查docs,您会看到默认情况下delay
对计算进行操作。Scheduler
此外,对于那些具有默认Scheduler
s 的运算符,通常有一个重载变体允许您指定所需的Scheduler
.
推荐阅读
- javascript - vuedraggable 背景使 div 不可拖动
- python - 如何使用 pandas/numpy/python 数学库计算平均绝对误差 (MAE) 和平均有符号误差 (MSE)?
- node.js - 防止 API 调用中的潜在竞争条件?
- sql - 如何在 SQL Server 中为 order by 子句跳过 n 行
- visual-studio - 无法将 MASM 函数导入 C
- javascript - Javascript,循环播放声音
- java - Android应用程序中的Tensorflow Lite自定义对象检测模型错误
- javascript - 使用 TypeScript 进行迭代
- quarkus - 在运行时配置数据源类型
- android - Android应用程序可以在应用程序启动后请求麦克风权限吗