首页 > 解决方案 > 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。我不确定为什么。

标签: rx-java2rx-android

解决方案


请注意,某些运算符在指定的 default 上运行,特别是与时间偏移有关Scheduler的运算符(例如在本例中)。delay否则,如果没有Scheduler指定,它们将在生成下一个发射之前等待主线程。

如果您检查docs,您会看到默认情况下delay对计算进行操作。Scheduler

此外,对于那些具有默认Schedulers 的运算符,通常有一个重载变体允许您指定所需的Scheduler.


推荐阅读