首页 > 解决方案 > 使用 Flowable 观察片段 backstack 条目计数的变化

问题描述

我想监视片段是否已添加到活动中。我有活动实例,我在非活动类中使用它来监视是否将任何片段添加到活动中。我创建了 Flowable 来观察计数变化,如下所示。

FragmentManager fragmentManager = mActivity.getSupportFragmentManager();
Flowable<Integer> mIntegerObservable = Flowable.just(fragmentManager.getBackStackEntryCount());
mIntegerObservable.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(fragC -> {
            Log.e("Count:", ""+fragC);
        }, error -> {
            //do something on error
        });

仅在我放置此代码并且记录的值为 0 的位置调用订阅,现在如果我在活动订阅者中添加片段,则不会被触发。我怎样才能做到这一点?

标签: androidrx-java2

解决方案


fragmentManager.getBackStackEntryCount()根据您的代码,您的 Flowable 只会发出一个值,即返回的当前值:

Flowable<Integer> mIntegerObservable = Flowable.just(fragmentManager.getBackStackEntryCount());

不幸的是 FragmentManager 不提供反应流,但它提供了一种使用FragmentManager.addOnBackStackChangedListener设置侦听器的方法。因此,您必须将回调转换为反应式流

您可以通过以下方式实现:

        Flowable<Integer> flowable = Flowable.create((FlowableOnSubscribe<Integer>) emitter -> {
            OnBackStackChangedListener listener = new OnBackStackChangedListener() {
                @Override
                public void onBackStackChanged() {
                    emitter.onNext(fragmentManager.getBackStackEntryCount());
                }
            };

            fragmentManager.addOnBackStackChangedListener(listener);

            // Remove the listener when this stream is cancelled:
            emitter.setCancellable(() -> fragmentManager.removeOnBackStackChangedListener(listener));
        }, BackpressureStrategy.LATEST);

推荐阅读