Как использовать Viewmodel Singleton для деятельности?

MyApp нужно хранить объект User во всем контексте ,A,B,C activity'xml используют этот объект User, когда A редактируют пользователя, я хочу B и C notifyChange, как решить эту проблему с привязкой данных, liveata и viewModel?

Раньше я заставлял User.class расширять BaseObservable, но POJO будет очень хлопотным и не должен быть нулевым, иногда User может быть нулевым, например не входить в систему. Теперь я изменяю, чтобы использовать LiveData, сделать Pojo простым и не расширять BaseObservable, но когда редактирование A, B и C не работают, я думаю, что мне нужно, чтобы ABC использовал один и тот же экземпляр viewModel в памяти, но это вызовет триггер onClear() viewModel.

2 ответа

Другой способ - создать один одноэлементный репозиторий для хранения пользовательских данных, и каждая модель представления может иметь этот репозиторий и совместно использовать одни и те же данные между действиями.

На основе этой части документации:https://developer.android.com/topic/libraries/architecture/livedata

Тот факт, что объекты LiveData учитывают жизненный цикл, означает, что вы можете совместно использовать их между несколькими действиями, фрагментами и службами. Чтобы не усложнять пример, вы можете реализовать класс LiveData как синглтон следующим образом:

Вы можете создать синглтон для своей модели представления, как я сделал здесь:

    companion object{
    private lateinit var instance: ViewModelProfile

    fun getInstance(userId: String): ViewModelProfile{
        instance = if(::instance.isInitialized) instance else ViewModelProfile(userId)
        return instance
    }
}

Затем я вызываю его и получаю экземпляр примерно так:

val profileVModel = ViewModelProfile.getInstance(user.uid)

Если вы хотите разделить общую ViewModel между действиями ABC, то предлагается сохранить их как 3 фрагмента в одном действии, создать ViewModel этого действия, которое можно разделить между всеми тремя фрагментами A, B и C.

То, что вы пытаетесь достичь с помощью действий, выглядит следующим образом: предположим, что вы выполнили какую-то операцию в действии A, если вы хотите, чтобы действия B и C получали уведомления о них, тогда они должны быть запущены для получения уведомлений, что не будет происходит, поэтому вместо этого вы должны использовать Intent или же Bundle передавать необходимую информацию, когда деятельность начинается.

обновленный

Есть и другие способы достижения подобного рода функциональности, такие как,

  • Event Bus
  • RxJava Предметы (см. Это)
  • Android State от Evernote (см. Это)

Это позволит вам иметь доступ к состоянию приложения на уровне приложения, к которому может обратиться любая активность или фрагмент

Другие вопросы по тегам