赞
踩
在 Android 开发中,MVVM(Model-View-ViewModel)模式是一种非常流行的架构模式,它可以帮助开发者更好地组织代码,使得应用程序更加模块化、易于维护。
1. MVVM 概念回顾
1.1 Model
职责:处理数据和业务逻辑。
实例:数据访问对象(DAO)、网络请求、数据库操作等。
1.2 View
职责:展示数据和与用户交互。
实例:Activity、Fragment、View 等。
1.3 ViewModel
职责:作为 Model 和 View 之间的桥梁,处理 UI 相关的逻辑。
实例:持有数据和 UI 相关的状态,处理用户输入,更新 UI 等。
2. Android 架构组件支持
2.1 LiveData
用途:在 ViewModel 中使用,当数据发生变化时通知 View 更新。
特点:生命周期感知,只在 Activity 或 Fragment 的生命周期内有效。
2.2 ViewModel
用途:保存与 UI 相关的数据状态。
特点:生命周期感知,不会因为配置变化而被销毁。
2.3 Data Binding
用途:实现 View 和 ViewModel 之间的双向绑定。
特点:简化 UI 更新逻辑,减少手动更新 UI 的代码。
3. 实战应用示例
3.1 创建 ViewModel
- public class MainViewModel extends ViewModel {
- private MutableLiveData<String> text;
-
- public MainViewModel() {
- text = new MutableLiveData<>();
- text.setValue("Hello World!");
- }
-
- public LiveData<String> getText() {
- return text;
- }
- }
3.2 创建 Repository
- public class MainRepository {
- private final DataSource dataSource;
-
- public MainRepository(DataSource dataSource) {
- this.dataSource = dataSource;
- }
-
- public LiveData<String> fetchTextFromNetwork() {
- // Simulate network request
- return dataSource.fetchData();
- }
- }
3.3 创建 DataSource
- public class NetworkDataSource implements DataSource {
- @Override
- public LiveData<String> fetchData() {
- MutableLiveData<String> data = new MutableLiveData<>();
- // Simulate a network call
- new Thread(() -> {
- try {
- Thread.sleep(2000); // Simulate delay
- data.postValue("Data from the network");
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }).start();
- return data;
- }
- }
3.4 在 Activity 中使用 ViewModel
- public class MainActivity extends AppCompatActivity {
- private MainViewModel viewModel;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- viewModel = new ViewModelProvider(this).get(MainViewModel.class);
-
- // Observe LiveData and update UI
- viewModel.getText().observe(this, text -> {
- TextView textView = findViewById(R.id.text_view);
- textView.setText(text);
- });
-
- // Fetch data from repository
- MainRepository repository = new MainRepository(new NetworkDataSource());
- viewModel.setText(repository.fetchTextFromNetwork());
- }
- }
3.5 使用 Data Binding
- <!-- activity_main.xml -->
- <layout xmlns:android="http://schemas.android.com/apk/res/android">
- <data>
- <variable
- name="viewModel"
- type="com.example.MainViewModel" />
- </data>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
- <TextView
- android:id="@+id/text_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@{viewModel.text}" />
- </LinearLayout>
- </layout>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。