В разработке 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