Прослушивание вставки базы данных комнаты с помощью RXJava - PullRequest
0 голосов
/ 11 января 2019

У меня есть простое приложение Android с базой данных Room, и я пытаюсь отреагировать на запрос @Insert с помощью RxJava, но я не могу правильно связать вызовы.

Это мой метод модели представления, вызывающий вставку:

fun insertTopic(): Single<Long> {
        val topic = Topic(null, topicText.value!!, difficulty.value!!, false)

        return Single.create<Long> { Observable.just(topicDao.insert(topic)) }
    }

И вот код в моей активности, запускающий действие сохранения:

disposable.add(RxView.clicks(button_save)
            .flatMapSingle {
                viewModel.insertTopic()
                    .subscribeOn(Schedulers.io())
            }.observeOn(AndroidSchedulers.mainThread())
            .doOnError { Toast.makeText(this, "Error inserting topic", Toast.LENGTH_SHORT).show() }
            .subscribe { id ->
                // NOT INVOKED
                hideKeyboard()
                Toast.makeText(this, "Topic inserted. ID: $id", Toast.LENGTH_SHORT).show()
                this.finish
            })

Когда я нажимаю кнопку, объект сохраняется, но не вызывается код подписки (тост не отображается). Может ли кто-нибудь указать мне, что я делаю не так? Я довольно новичок в RX Java.

1 Ответ

0 голосов
/ 11 января 2019

Проблема в неправильном использовании Single.create. Нет необходимости упаковывать topicDao.insert(topic) в Observable. Более того, вы внедряете новый Single вручную, что означает, что вы должны передать идентификатор результата в аргумент @NonNull SingleEmitter<T> emitter. Но здесь нет необходимости использовать Single.create.

Single.fromCallable это именно то, что вам нужно:

fun insertTopic(): Single<Long> = Single.fromCallable {
    val topic = Topic(null, topicText.value!!, difficulty.value!!, false)
    return@fromCallable topicDao.insert(topic)
}

Обратите внимание, что я создаю topic объект внутри лямбды, чтобы он не захватывался в замыкании. Также имейте в виду, что fromCallable может выдать UndeliverableException, если вы отмените подписку на Single во время выполнения лямбда-кода. Это, вероятно, никогда не произойдет в вашем конкретном случае, но вы должны понимать, RxJava2 обработка ошибок дизайн.

...