0

I want to monitor if the fragment has been added to the activity. I have instance of activity, which I am using in non-activity class to monitor if any fragment is added to activity. I have created Flowable to watch the count change which is as follows.

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
        });

Subscribe is being called only once where I have placed this code and the value logged is 0, Now if I add fragment inside activity subscriber is not not being triggered. How can I achieve this?

Gustavo Pagani
  • 6,583
  • 5
  • 40
  • 71
karan
  • 8,637
  • 3
  • 41
  • 78

2 Answers2

0

You can register FragmentManager.OnBackStackChangedListener and emit values when the listener is called.

Derek K
  • 2,756
  • 1
  • 21
  • 37
0

Your Flowable will only emit one value, the current value that is returned by fragmentManager.getBackStackEntryCount(), as per your code:

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

Unfortunately FragmentManager doesn't provide reactive streams, but it provides a way of setting a listener with FragmentManager.addOnBackStackChangedListener. So you would have to convert a callback into an reactive stream.

You can achieve it this way:

        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);
Gustavo Pagani
  • 6,583
  • 5
  • 40
  • 71