2017-08-15 49 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)可观察的将触发处置逻辑。