rxjava 2.x片段内的热观察

时间:2017-01-30 17:30:00

标签: android rx-java

当取消订阅并重新订阅片段中的热观察时,我遇到一个奇怪的问题,第二次订阅不会收到任何onNext。这是我的代码:

@Override
public void onViewCreated( View view, @Nullable Bundle savedInstanceState )
{
    getHotObservable().subscribe( new Observer<...>( )
            {
                @Override
                public void onSubscribe( Disposable d )
                {
                    mCompositeDisposable.add( d );
                }

                @Override
                public void onNext( ... )
                {
                    ...
                }

                @Override
                public void onError( Throwable e )
                {

                }

                @Override
                public void onComplete( )
                {

                }
            } );
}

@Override
public void onDestroyView( )
{
    mCompositeDisposable.dispose( );
    super.onDestroyView( );
}

所以使用这个实现它会在第一次创建片段时工作,但如果我替换我的片段并将事务添加到backstack然后弹出backstack,我将永远不会获得任何onNext。

我的实际解决方法是从onAttach / onDetach订阅/取消订阅并向我的observable添加一个过滤器以检查片段视图是否为空

@Override
public void onAttach( Context context )
{
    super.onAttach( context );

    getHotObservable()
            .filter( new AppendOnlyLinkedArrayList.NonThrowingPredicate<...>( )
            {
                @Override
                public boolean test( ... )
                {
                    return getView( ) != null;
                }
            } )
            .subscribe( new Observer<...>( )
            {
                @Override
                public void onSubscribe( Disposable d )
                {
                    mCompositeDisposable.add( d );
                }

                @Override
                public void onNext( ... )
                {
                    ...
                }

                @Override
                public void onError( Throwable e )
                {

                }

                @Override
                public void onComplete( )
                {

                }
            } );
}

@Override
public void onDetach( )
{
    mCompositeDisposable.dispose( );
    super.onDetach( );
}

我无法弄清楚为什么第一个解决方案无法工作,因为我每次都会订阅一个全新的观察者。也许我的解决方法是正确的方法?

THX!

0 个答案:

没有答案