2016-09-19 87 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 } 
     }) 

代碼不進行測試。可能有語法錯誤。