RxJava:观看自定义课程

时间:2016-09-19 20:41:39

标签: java event-handling rx-java

我有一个自定义类,称之为Builder。它有一个方法act(),它执行异步操作。操作完成后,我想发出一个事件。

如何在RxJava中完成此操作?

看起来像是一项简单的任务,但我还没有看到正确的RxJava方法。

有关详细信息,典型的act()方法如下所示:

    class Builder
       public void act() {
            processRunner.runAsync(new ProcessRunner.ProcessResultHandler(){
                @Override
                public void onComplete(int result) {
                    // Emit event
                }
            });
        }

我想要的是在消费类中,打电话:

builder.act()

以某种方式警告何时调用onComplete()

我也控制ProcessRunner,所以我想将它转换为RxJava并链接结果,但是现在我将采用简单的用例!

2 个答案:

答案 0 :(得分:1)

您需要从Observable<Boolean>方法返回act。然后,您可以在onCompleted上致电Subscriber,这将是您的消费类。

代码:

 class Builder {
   public Observable<Boolean> act() {
      return Observable<Boolean>.create {
        public void call(final Subscriber subscriber) {
         processRunner.runAsync(new ProcessRunner.ProcessResultHandler(){
            @Override
            public void onComplete(int result) {
                subscriber.onNext(true);
                subscriber.onCompleted();
            }
        });
       }
      }
   }
 }

消费类:

     builder.act().subscribe({
        void onNext(boolean status) {}
        void onCompleted() { // finished }
      })

代码未经测试。可能存在语法错误。

答案 1 :(得分:1)

可以在RxJava中使用 PublishSubject 。让我向您解释如何将它用于您的构建器。创建类,如下所示:

public class Communicator {
  private static Communicator  mCommunicator = new Communicator();
  private PublishSubject<Void> mGrabEvent = new PublishSubjetct.create();
  private Communicator(){
  }
  public static getCommunicator(){
   return mCommunicator
  }
  public static emitEventItem(){
     // you can pass any object that you want to listen
     mGrabEvent.onNext(null);
  }
 public PublishSubject<Void> subscribeEvent(){
   return mGrabEvent;
 }
}

这个课程可以帮助你发出&amp;订阅它以便在您的应用程序的任何位置收听该特定事件。下面我尝试向您展示如何将该侦听器发射并挂钩到您的活动或片段中。

一个。用于从构建器类发出消息

class Builder{
  public void act() {
    processRunner.runAsync(new ProcessRunner.ProcessResultHandler(){
      @Override
      public void onComplete(int result) {
        // Emit event
        Communicatort.getCommunicator().emitEventItem();
      }
    });
  }
  }

B中。另一个结束点,您可以通过订阅来听取它。

Communicatort.getCommunicator().subscribeEvent().subscribe(new Action<Void>(){
  @overrider
  public void call(Void void){
  }
});

℃。最后,请确保您取消订阅活动的详细信息。

我希望能帮助你。如果您能理解,请告诉我。

谢谢, Bhavdip