Компоненты архитектуры Android Контекст ViewModel

Я изучаю компоненты архитектуры Google для реализации ViewModel и LiveData для моего приложения, и в официальной документации говорится, что:

Примечание. Поскольку ViewModel переживает конкретные действия и фрагменты, он никогда не должен ссылаться на View или любой класс, который может содержать ссылку на контекст действия. Если ViewModel нужен контекст приложения (например, для поиска системной службы), он может расширить класс AndroidViewModel и иметь конструктор, который получает приложение в конструкторе (поскольку класс приложения расширяет контекст).

После этого я получил такой код:

public class ViewModelTest extends AndroidViewModel {

public ViewModelTest(Application application) {
    super(application);
}

public void test(){
    Prefs.getCurrentCode(getApplication());
}

И должен ли я инстанцировать это нормально на активность?

  val viewModel2 = ViewModelProviders.of(this).get(ViewModelTest::class.java)
    viewModel2.test()

Разве это не плохо? Чтобы использовать эту переменную приложения, когда необходимо получить доступ к SharedPreferences или что-нибудь, что нуждается в контексте? И если это так, следует ли мне избегать его использования в ViewModel и использовать его только в представлении? Особенно, если я хочу обновить компонент пользовательского интерфейса со значением, которое требует контекста. Я вроде не знаю, как подойти к этому вопросу, и я открыт для любых предложений.

заранее спасибо

1 ответ

Класс AndroidViewModel предоставляется как часть пакета android.arch.lifecycle, который является частью компонентов архитектуры Android. Он сам вызывает контекст приложения, переданный в конструктор. Контекст приложения живет в течение жизненного цикла Activity.

С контекстом приложения в ViewModel все в порядке, поскольку контекст приложения привязан ко всему жизненному циклу приложения, а не к контексту активности, который привязан к жизненному циклу активности.

Документация ViewModel, в частности, ссылается не на контекст деятельности, а на контекст приложения, если это нормально.

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