在RxJava2中将侦听器转换为Single

时间:2018-04-26 07:55:43

标签: android kotlin rx-java reactive-programming rx-java2

我正在使用Play服务Auth api Phone,到目前为止我已经使用了foll

  fun startSmsListener() {
    val client = SmsRetriever.getClient(applicationContext /* context */);
    val task = client.startSmsRetriever();
    task.addOnSuccessListener(object : OnSuccessListener<Void> {
        override fun onSuccess(p0: Void?) {
             //do somethin
        }

    })
    task.addOnFailureListener(object : OnFailureListener {
        override fun onFailure(p0: Exception) {
            //Handle error
        }

    })
}

现在我想将它放在一个SmsManager类中并将其转换为Single / Observable,这样我就可以在我的viewmodel中以一种被动方式处理它。我怎么能这样做?

到目前为止,我已经得到了这个:

var single = Single.create(SingleOnSubscribe<Void> { e ->
                val task = client.startSmsRetriever()
                task.addOnSuccessListener {
                    e.onSuccess(it)
                }
                task.addOnFailureListener {
                    e.onError(it)
                }
        })

但是我不确定这段代码是否正确,是否有一些遗漏,比如在处置后删除了听众。

任何帮助?

2 个答案:

答案 0 :(得分:4)

您对“布尔”值感兴趣 - 连接或未连接,因此您应使用Single代替Completable

Completable.create { emitter -> 
    val client = SmsRetriever.getClient(applicationContext)
    val task = client.startSmsRetriever() 
    task.addOnSuccessListener { emitter.onComplete() } 
    task.addOnFailureListener { emitter.tryOnError(it) }
} 

答案 1 :(得分:1)

虽然手动创建Completable可行,但您也可以查看RxTask项目。它为Google Play服务任务API&#34;。

提供了&#34; RxJava 2绑定

如果你只需要在一个地方,一个额外的图书馆肯定是一种矫枉过正。但是如果你打算与RxJava一起使用更多Play服务,那么可能值得一看......

它还没有({)为SmsRetriever显式提供一个包装器,但是一般的任务帮助器类可能就足够了:

val client = SmsRetriever.getClient(applicationContext)
val smsReceiver = CompletableTask.create(client::startSmsRetriever)