【问题标题】:Convert Listener to Single in RxJava2在 RxJava2 中将 Listener 转换为 Single
【发布时间】:2018-04-26 07:55:43
【问题描述】:

我正在使用 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
        }

    })
}

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

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

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

但我不确定这段代码是否正确,是否缺少一些东西,比如在处理后删除监听器。

有什么帮助吗?

【问题讨论】:

  • Single&lt;Void&gt; 不起作用,因为不允许使用 nulls。使用Completable

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


【解决方案1】:

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

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

【讨论】:

  • 这里不需要!it.isDisposedit.onComplete/it.tryOnError 会为你做的。
  • 你能扩展一下@akarnokd
【解决方案2】:

虽然可以手动创建Completable,但您也可以查看RxTask 项目。它提供“RxJava 2 绑定 Google Play 服务任务 API”。

如果您只在一个地方需要它,那么一个额外的库肯定是多余的。但如果你打算将更多 Play Services 与 RxJava 一起使用,那可能值得一看……

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2021-03-20
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    相关资源
    最近更新 更多