Конвертировать слушатель в Single в RxJava2 - PullRequest
0 голосов
/ 26 апреля 2018

Я пользуюсь 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)
                }
        })

Но я не уверен, является ли этот код правильным или нет, есть ли что-то, чего я пропускаю, например, удаление слушателей после удаления.

Любая помощь?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Хотя создание Completable вручную будет работать, вы также можете взглянуть на проект RxTask . Он обеспечивает «привязку RxJava 2 для API задач Google Play Services».

Если вам это нужно только в одном месте, лишняя библиотека наверняка будет излишней. Но если вы планируете использовать больше Play Services вместе с RxJava, возможно, стоит посмотреть ...

Он (пока) не предоставляет обертку явно для SmsRetriever, но общих вспомогательных классов задачи, вероятно, будет достаточно:

val client = SmsRetriever.getClient(applicationContext)
val smsReceiver = CompletableTask.create(client::startSmsRetriever)
0 голосов
/ 26 апреля 2018

Вас интересует «логическое» значение - подключено или не подключено, поэтому вместо Single следует использовать Completable:

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