2017-08-15 47 views
0

我正在使用RXJava2在廣播接收器內發送電子郵件,我想知道何時應該取消訂閱該事件。該代碼基本上是:如何取消訂閱廣播接收器中的RXjava呼叫

 getSmsMmsObservable() 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnError(throwable -> Timber.e(throwable, "Error sending mail.")) 
      .map(smsMmsAddress1 -> { 
       smsMmsAddress = smsMmsAddress1; 
       return doInBackgroundSendEmail(); 
      }) 
      .map(stringSingle -> { 
       mMsgResponse = stringSingle; 
       this.done = true; 
       return deleteFile(); 
      }) 
      .subscribe(success -> { 
       if (success) { 
        Toast.makeText(context, "Message Status: " + mMsgResponse, Toast.LENGTH_LONG).show(); 
       } 

      }); 

我什麼時候取消(沒有在onPause或在的onDestroy接收器),我如何知道什麼時候的onReceive完了?接收者通過清單進行註冊。我想過做一個複合觀察,然後把它在subscribe()部分中處理掉。

compositeDisposable.add(
    getSmsMmsObservable() 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnError(throwable -> Timber.e(throwable, "Error sending mail.")) 
      .map(smsMmsAddress1 -> { 
       smsMmsAddress = smsMmsAddress1; 
       return doInBackgroundSendEmail(); 
      }) 
      .map(stringSingle -> { 
       mMsgResponse = stringSingle; 
       this.done = true; 
       return deleteFile(); 
      }) 
      .subscribe(success -> { 
       if (success) { 
        Toast.makeText(context, "Message Status: " + mMsgResponse, Toast.LENGTH_LONG).show(); 
       } 
       compositeDisposable.dispose(); 

      }) 
    ); 
+0

嘗試在服務中執行此操作,而不是接收方 –

+0

我不行,我需要在收到文本時觸發此操作。 –

+0

你應該開始服務併發送文本給他。 另一個解決方案 - Android會在onReceive()調用後10秒內殺死接收者 –

回答

0

正如在這裏指出,不應在廣播接收器執行長時間任務。
廣播接收器沒有生命週期,當您的onReceive返回它認爲由系統完成的事件,並且您的整個過程可能隨後會被驅動時,它將在您執行異步處理時立即返回。 (在「進程狀態效果」下的更多信息https://developer.android.com/guide/components/broadcasts.html)。

您應該爲此任務創建一個專用服務並在那裏執行電子郵件發送,服務您有明確的生命週期,您應退訂onDestory()。還要注意有限的背景處理和從棉花糖和打盹開始的互聯網訪問。

在任何情況下,你不應該在onNext/onCompleted處理,當它結束時(onCompleted/onError)可觀察的將觸發處置邏輯。