Царство с живыми данными и Rx Java в Kotlin - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь использовать Realm в приложении на основе Kotlin.

Я создал базовый проект c, в котором проверялось добавление элементов в область и наблюдение за ними с использованием живых данных и модели представления. .

Затем я хотел добавить некоторые другие наблюдаемые и использовать для комбинирования их использовать lateLatest из Rx Java.

Я создал наблюдаемые Rx для всех наблюдаемых. Я наблюдаю живые данные из Realm, а затем вызываю метод onNext () Rx Java BehaviourSubject, чтобы установить для одного из наблюдаемых Rx то же значение, что и у данных наблюдаемой области. Это работает нормально, но как только я добавил Throttle для Rx Operators, я получил следующее сообщение об ошибке:

Доступ к области из неверного потока. Доступ к объектам области возможен только в том потоке, в котором они были созданы. по адресу io.realm.BaseRealm.checkIfValid (BaseRealm. java: 442) по адресу io.realm.com_example_myapplication_ItemRealmProxy.realmGet $ id (com_example_myapplication_ItemRealmProxy. java: 105 * application_exject_exject_exject_exject_exject_exject_exject_exject_exject_exject_ex_ : 661)

Это часть моего кода:

 private val itemViewModel: ItemViewModel by lazy {
        ViewModelProviders.of(this).get(ItemViewModel::class.java)
    }

    val itemsSubject = BehaviorSubject.createDefault(listOf<Item>())
    val intsSubject = BehaviorSubject.createDefault(4)



itemViewModel.getItemData().observe(this, Observer<RealmResults<Item>> { t ->
            val items = t.map {
                it
            }

            itemsSubject.onNext(items)
        })

  Observables.combineLatest(itemsSubject, intsSubject) { a, b ->
        a
    }.throttleLast(500, TimeUnit.MILLISECONDS).subscribe {
        Log.i("Items", "Items combined read: ${it}")
    }

Я не вижу, как область связана с вызовом onNext или с дросселем. Кажется очень странным.

В идеале я хотел бы придерживаться только живых данных, но мне нужно выполнять операции с другими наблюдаемыми, и Rx Java хорош для этого.

1 Ответ

0 голосов
/ 09 января 2020

Мне нужно было наблюдать за Rx Java в главном потоке следующим образом:

 Observables.combineLatest(itemsSubject, intsSubject) { a, b ->
            a
        }.throttleLast(500, TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe {
            Log.i("Items", "Items combined read: ${it}")
        }
    }

В некотором смысле ошибка Realm вводила в заблуждение, поскольку в конечном итоге это было неправильное использование Rx Java.

...