2016-09-19 90 views
0

我有一个自定义类,叫它Builder。它有一个方法act(),它执行异步操作。操作完成后,我想发出一个事件。RxJava:手表自定义类

我该如何在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和链的结果,但现在我要简单的用例!

回答

1

这可以使用PublishSubject在RxJava。让我向你解释如何将它用于你的建造者。创建类,如下图所示:

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

这个类会帮助你发出&认购其收听特定事件的任何地方到你的应用。下面我试着向你展示如何发出并将该监听器挂接到你的活动或片段中。

A.对于发出的邮件从您的生成器类

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

C.最后,请确保您取消订阅它的onDestroy活动。

我希望能帮到你。让我知道你是否可以在任何时候理解。

感谢, Bhavdip

+1

PublishSubject是我终于实现了这一个,但我把它放在构建器类本身。感谢您的额外信息,它看起来像一个不错的方法! – mtyson

+0

请记住,主题是“热点可观察”,这意味着即使没有人订阅它也可以发射物品。例如,你的传播者可以在没有人听到它时开始发射物品。 –

+0

这是真的,但可以处理传播者类内部。你可以检查一些是否订阅它。 –

1

您需要从act方法中返回Observable<Boolean>。那么你可以致电onCompletedSubscriber这将是你的消费类。

代码:

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

代码不进行测试。可能有语法错误。