android - 使用 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 的位置调用订阅,现在如果我在活动订阅者中添加片段,则不会被触发。我怎样才能做到这一点?
解决方案
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);
推荐阅读
- node.js - 如何用 sinon 存根 oracledb?
- linux - 分析被黑网站日志:上传文件时./etc 和./tmp 之间是否有任何链接?
- eclipse - 来自eclipse的spark scala maven构建错误-对象X不是包Y的成员
- macos - Mac w/PostgreSQL 刷新/清空缓存用于性能调整
- python - cmake调用python脚本并验证
- sql - 更改 Power BI 数据集的 SQL 表设计
- sql - Microsoft Access 表显示为空白,但查询正确地从表中提取数据
- azure - .NET Core 2.0 HttpClient Singleton 抛出 502
- android - 禁用滚动视图子,但保持可滚动并启用外观
- git - 我想忽略 .gitignore 中以点 (.) 开头的特定文件