2017-05-19 78 views
0

我做了一個Rxjava wrrapper的火力signInWithCustomToken()方法,這裏是代碼:是什麼ObservableOnSubscribe回調裏面聽衆的生命週期 - Rxjava

public Observable<AuthResult> signInWithCustomToken(String token) { 
    return Observable.create(new ObservableOnSubscribe<AuthResult>() { 
     @Override public void subscribe(ObservableEmitter<AuthResult> emitter) throws Exception { 
     firebaseAuth.signInWithCustomToken(token) 
      .addOnSuccessListener(new OnSuccessListener<AuthResult>() { 
       @Override public void onSuccess(AuthResult result) { 
       emitter.onNext(result); 
       } 
      }) 
      .addOnFailureListener(new OnFailureListener() { 
       @Override public void onFailure(@NonNull Exception e) { 
       emitter.onError(e); 
       } 
      }) 
      .addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
       @Override public void onComplete(@NonNull Task<AuthResult> task) { 

       emitter.onComplete(); 
       } 
      }); 
     } 
    }); 
    } 

,所以我想知道什麼是三名聽衆的生命週期( OnSuccessListener - OnFailureListener() - OnCompleteListener)裏面的Rx回調,他們有相同的生命週期的回報Observable,換句話說,如果我打電話observable.dispose(),他們會從內存中清除?

我還有一個問題很抱歉,這是用Rx方式建模這種方法的最佳方法嗎?

謝謝你在avance。

回答

0

我回答我的問題,調用dispose()不保證從內存中刪除這些偵聽器。但有一個很好的解決方案。每當您從偵聽器或回調創建Observable時,請確保設置可取消並清除那裏的內容。

emitter.setCancellable(new Cancellable() { 
    @Override 
    public void cancel() throws Exception { 
    //clean memory 
} 
}); 

但是與相關代碼提及的情況下,即火力不提供以清除signwithCustomToken()那些聽衆的方法。但其他像DatabaseReference有removeListenr()方法來取消時清除的東西。

emitter.setCancellable(new Cancellable() { 
    @Override 
    public void cancel() throws Exception { 
    databaseReference.removeEventListener(valueEventListener); 
} 
}); 
0

它們是否具有相同的返回Observable生命週期,換句話說,如果我調用observable.dispose(),它們是否會從內存中清除?

不,你需要指定自己支配邏輯,且有從firebaseAuth刪除你的聽衆,您可以使用Emitter.setDisposable()Emitter.setCancellable()做到這一點,如果你不提供它,那麼Observable只會解開連接在SubscriberObservable之間,並且將停止發射事件,但聽衆將保持註冊到firebaseAuth並且可能發生內存泄漏。

我還有一個問題,對不起,這是用Rx方式建模這種方法的最佳方法嗎?

使用RxJava2創建方法是封裝異步回調方法的有效方法。但是,對於RxJava2,開銷最低的默認方式是擴展Observable並使用Observer方法來通知事件/寄存器處理回調。你可以閱讀更多here

相關問題