我正在使用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)
}
})
但是我不确定这段代码是否正确,是否有一些遗漏,比如在处置后删除了听众。
任何帮助?
答案 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;。
如果你只需要在一个地方,一个额外的图书馆肯定是一种矫枉过正。但是如果你打算与RxJava一起使用更多Play服务,那么可能值得一看......
它还没有({)为SmsRetriever
显式提供一个包装器,但是一般的任务帮助器类可能就足够了:
val client = SmsRetriever.getClient(applicationContext)
val smsReceiver = CompletableTask.create(client::startSmsRetriever)