Как использовать lifecycleObserver для ON_CREATE до вызова метода - PullRequest
0 голосов
/ 02 декабря 2018

Я использую RealmDB и, согласно документации, лучше всего получить экземпляр БД с помощью методов onCreate и очистить его с помощью onDestroy, пока все хорошо - я сделал это.

Поскольку у нас есть несколько схем для различных объектов данных, я хочу сделать мой код чище, используя что-то вроде этого:

interface RealmOwner : RealmOwnerBase {
    val realmContainer: BaseRealmContainer

    override val configurationA: Realm
        get() = realmContainer.configurationA
    override val configurationB: Realm
        get() = realmContainer.configurationB

    abstract class BaseRealmContainer {
        lateinit var configurationA: Realm
        lateinit var configurationB: Realm
    }

    open class RealmContainer
        : BaseRealmContainer() {

        open fun initRealm() {
            configurationA = RealmFactory.configurationA
            configurationB = RealmFactory.configurationB
        }

        open fun closeRealm() {
            listOf(configurationA, configurationB).forEach { it.close() }
        }
    }

    class LifecycleRealmContainer(lifecycle: Lifecycle)
        : RealmContainer(), LifecycleObserver {

        init {
            lifecycle.addObserver(this)
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        override fun initRealm() {
            super.initRealm()
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        override fun closeRealm() {
            super.closeRealm()
        }
    }
}

Действия и фрагменты могут наследоваться от "RealmOwner" и реализовывать обязательный realmContainer с использованиемЗатем «LifecycleRealmContainer» и, передав в него свой жизненный цикл, - initRealm будет вызываться с «onCreate», а «closeRealm» - с «onDestroy».

Это делается для того, чтобы во время их OnCreateВы можете запросить БД для инициализации.Проблема заключается в том, что обратный вызов LifecycleEvent выполняется после , когда вызывается фактический метод onCreate.Поэтому - экземпляры БД не инициализируются.

class ExampleActivity: AppCompatActivity(), RealmOwner {
    override val realmContainer = RealmOwner.LifecycleRealmContainer(lifecycle)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        configurationA.where<SomeRealmObject>().findAll() // object isn't initialized error
    }
}

Вопрос в том, есть ли для меня хороший чистый способ инициализации экземпляров БД с помощью инструмента "LifecycleObserver" до В операции / фрагменте, который я пытаюсь инициализировать, вызывается метод onCreate?

...