Глубокое понимание и применение Android Jetpack ViewModel

В разработке Android разделение данных и интерфейса всегда было важной задачей. Чтобы решить эту проблему, Google представил ViewModel, один из компонентов Android Jetpack. ViewModel — это архитектурный компонент для управления данными, связанными с пользовательским интерфейсом, который может помочь разработчикам внедрить элегантное управление данными и жизненным циклом. Эта статья познакомит вас с использованием и принципом ViewModel простым и понятным способом и поможет вам шаг за шагом освоить этот мощный компонент.

Что такое ViewModel

ViewModel — это один из компонентов Android Jetpack. Его основная цель — отделить контроллеры пользовательского интерфейса (такие как Activity и Fragment) от бизнес-логики, связанной с данными, чтобы контроллеры пользовательского интерфейса могли сосредоточиться на отображении данных и реагировании на действия пользователя, в то время как сбор данных и Обработка передается ViewModel для управления. Такое разделение делает код чище, его легче тестировать и поддерживать.

Принцип ViewModel

Принцип ViewModel на самом деле не сложен. При изменении конфигурации устройства (например, при повороте экрана) и перестроении Activity или Fragment ViewModel не будет уничтожен, а останется в памяти. Таким образом, UI-контроллер может повторно получить предыдущий экземпляр ViewModel после реконструкции и продолжать использовать содержащиеся в нем данные, избегая, таким образом, потери данных и повторной загрузки.

ViewModelStore и ViewModelStoreOwner

Принцип ViewModel включает две основные концепции: ViewModelStore и ViewModelStoreOwner.

ViewModelStore — это контейнер, в котором хранятся экземпляры ViewModel, и его жизненный цикл связан с жизненным циклом UI-контроллера. Когда UI-контроллер (Activity или Fragment) уничтожается, ViewModelStore очищает экземпляр ViewModel в нем, чтобы избежать утечек памяти.

ViewModelStoreOwner — это объект, которому принадлежит ViewModelStore, обычно Activity или Fragment. ViewModelProvider получает ViewModelStore через ViewModelStoreOwner и управляет жизненным циклом ViewModel через ViewModelStore.

вьюмоделпровидер

ViewModelProvider — это класс инструментов для создания и получения экземпляров ViewModel. Он отвечает за связывание ViewModel с ViewModelStoreOwner и обеспечение уничтожения ViewModel в нужное время.

Получить экземпляр ViewModel в Activity:

viewModel = new ViewModelProvider(this).get(MyViewModel.class);

Получить экземпляр ViewModel во фрагменте:

viewModel = new ViewModelProvider(this).get(MyViewModel.class);

Использовать вьюмодель

Добавить зависимость ViewModel

Во-первых, убедитесь, что ваш проект использует AndroidX, и добавьте зависимость ViewModel в build.gradle:

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
}

Создание моделей представления

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

public class MyViewModel extends ViewModel {
    private MutableLiveData<String> data = new MutableLiveData<>();

    public LiveData<String> getData() {
        return data;
    }

    public void fetchData() {
        // 模拟异步数据获取
        new Handler().postDelayed(() -> {
            data.setValue("Hello, ViewModel!");
        }, 2000);
    }
}

Использование ViewModels в UI-контроллерах

Получите экземпляр ViewModel в Activity или Fragment и наблюдайте за изменениями данных:

viewModel = new ViewModelProvider(this).get(MyViewModel.class);
viewModel.getData().observe(this, data -> {
    // 更新UI
    textView.setText(data);
});

viewModel.fetchData(); // 触发数据获取操作

ViewModel и межкомпонентное взаимодействие

ViewModel используется не только для обмена данными внутри одного контроллера пользовательского интерфейса, но и для обмена данными между различными контроллерами пользовательского интерфейса для обеспечения межкомпонентной связи. Например, данные во фрагменте можно передать в действие через ViewModel.

Делитесь данными в действии:

sharedViewModel = new ViewModelProvider(this).get(SharedViewModel.class);
sharedViewModel.getData().observe(this, data -> {
    // 更新UI
    textView.setText(data);
});

Поделиться данными во фрагменте:

sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);

Примечание. При обмене данными между компонентами необходимо использовать один и тот же ViewModelProvider для получения одного и того же типа экземпляра ViewModel. В Activity используйте это как параметр ViewModelProvider, а во Fragment используйте в качестве параметра requireActivity().

ViewModel — сохраненное состояние

Иногда нам может понадобиться сохранить в ViewModel некоторые данные, не связанные с жизненным циклом UI-контроллера, чтобы можно было восстановить состояние при его перестроении. ViewModel предоставляет функцию SavedState, которая позволяет нам сохранять данные в ViewModel.

Образец кода:

public class MyViewModel extends ViewModel {
    private SavedStateHandle savedStateHandle;

    public MyViewModel(SavedStateHandle savedStateHandle) {
        this.savedStateHandle = savedStateHandle;
    }

    public LiveData<String> getData() {
        return savedStateHandle.getLiveData("data");
    }

    public void setData(String data) {
        savedStateHandle.set("data", data);
    }
}

Используйте SavedStateViewModelFactory для создания ViewModel с функциональностью SavedState:

public class MyActivity extends AppCompatActivity {
    private MyViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewModelProvider.Factory factory = new SavedStateViewModelFactory(getApplication(), this);
        viewModel = new ViewModelProvider(this, factory).get(MyViewModel.class);

        viewModel.getData().observe(this, data -> {
            // 更新UI
            textView.setText(data);
        });

        if (savedInstanceState == null) {
            // 第一次创建时,触发数据获取操作
            viewModel.fetchData();
        }
    }
}

На что следует обратить внимание в процессе использования ViewModel

  • Не храните ссылку на Context в ViewModel, чтобы избежать утечек памяти.
  • ViewModel должен фокусироваться только на данных и бизнес-логике и не должен обрабатывать операции, связанные с пользовательским интерфейсом.
  • Не сохраняйте большие объемы данных во ViewModel, чтобы не занимать слишком много памяти.
  • Когда объем данных велик или данные должны быть разделены между процессами, следует рассмотреть другие решения, такие как база данных Room или SharedPreferences.

в заключение

Из введения в эту статью вы поняли принцип использования Android Jetpack ViewModel. Появление ViewModel значительно упрощает управление данными и обработку жизненного цикла при разработке Android, делая приложения более надежными и эффективными. В реальной разработке разумное использование ViewModel может помочь вам создавать элегантные и простые в обслуживании приложения для Android.

Заметки об исследовании Android

Оптимизация производительности Android: https://qr18.cn/FVlo89
Транспортное средство Android: https://qr18.cn/F05ZCM
Android Reverse Security Примечания к исследованию: https://qr18.cn/CQ5TcL
Принципы Android Framework: https://qr18.cn/AQpN4J
Аудио и видео Android: https://qr18.cn/Ei3VPD
Jetpack (включая Compose): https://qr18.cn/A0gajp
Kotlin: https://qr18.cn/CdjtAF
Gradle: https://qr18.cn/DzrmMB
OkHttp Примечания к анализу исходного кода: https://qr18.cn/Cw0pBD
Flutter: https://qr18.cn/DIvKma
Android Eight Knowledge Body: https://qr18.cn/CyxarU
Android Core Notes: https://qr21.cn/CaZQLo
Android Прошлые вопросы на собеседовании: https://qr18.cn/CKV8OZ
2023 Последняя коллекция вопросов на собеседовании по Android: https://qr18.cn/CgxrRy
Android Vehicle Development Упражнения на собеседовании: https://qr18.cn/FTlyCJ
аудио и видео вопросы на собеседовании:https://qr18.cn/AcV6Ap

Guess you like

Origin blog.csdn.net/weixin_61845324/article/details/132253303