在 RxJava2 中将 Listener 转换为 Single

Mic*_*eap 1 android reactive-programming kotlin rx-java rx-java2

我正在使用 Play Services Auth api Phone,到目前为止我有以下内容

  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
        }

    })
}
Run Code Online (Sandbox Code Playgroud)

现在我想把它放在一个 SmsManager 类中,并将它转换成一个 Single/Observable,这样我就可以在我的视图模型中以一种反应方式处理它。我怎样才能做到这一点?

到目前为止,我有这个:

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

但我不确定这段代码是否正确,是否有遗漏的东西,比如在处理后删除监听器。

有什么帮助吗?

azi*_*ian 6

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

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