当取消订阅并重新订阅片段中的热观察时,我遇到一个奇怪的问题,第二次订阅不会收到任何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!