2015-10-14 45 views
1

我正在使用第三方库,我试图使用RxJava进行封装,以便可以通过RxJava实用程序向应用程序代码公开第三方库的功能。使用RxJava主题进行回调包装

获得第三方库实例后,它需要设置一个回调函数,以便在对库进行调用并完成它所需的任何操作时,它可以回调设置的回调函数Object来通知它已经完成了它所做的任何应用程序。

我认为这对Subject很好用,但我不能确定这是实施它的正确方法。当Wrapper类的doFirstThing方法被调用时,Wrapper类调​​用Subject的方法并设置一个新的Action0Object,当被调用时,对第三方库进行适当的方法调用。

当第三方库完成了它所做的任何事情之后,它会在回调Object上设置的Wrapper类中调用适当的方法。在设置的回调方法中,Wrapper使用传递给回调方法的值调用SubjectonNext方法。

这是实现此类功能的正确方法吗?

public class Wrapper { 

    private final ThirdPartyLibrary mThirdPartyLibrary; 
    private final Subject<Boolean, Boolean> mCallbackSubject; 

    public Wrapper() { 
     mThirdPartyLibrary = ThirdPartyLibrary.getInstance(); 
     mThirdPartyLibrary.setCallback(new WrapperThirdPartyCallback()) 

     mCallbackSubject = new SerializedSubject<>(PublishSubject.<Boolean>create()); 
    } 

    @Override 
    public Observable<Boolean> doFirstThing() { 
     return mConfigureSubject.doOnSubscribe(new Action0() { 
      @Override 
      public void call() { 
       mThirdPartyLibrary.doFirstThing(); 
      } 
     }); 
    } 

    public class WrapperThirdPartyCallback implements ThirdPartyCallback { 
     @Override 
     public void doOneThingComplete(boolean success) { 
      mCallbackSubject.onNext(success); 
     } 
    } 
} 
+0

在http://codereview.stackexchange.com/上问这样的问题会更好。 StackOVerflow适用于问题,而不是评论。 – ursa

+0

本质上,问题出在哪里,正如@akarnokd所说的,是“启动”流程的'doOnSubscribe'方法调用。 – anthonylawson

回答

0

使用Subject这里是适当的。但是,我不确定使用doOnSubscribe,因为它会调用doFirstThing的次数与可能同时运行并可能收到多个成功通知的订户的次数相同。

+0

这就是我所看到的行为。实际上,我遇到了另一种方法'doSecondThing',它也调用'doOnSubscribe',它进入了一个无限循环,因为调用一个方法会调用另一个方法。 – anthonylawson