Android架构组件:MVVM模式的实战应用

在 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

java 复制代码
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

java 复制代码
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

java 复制代码
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

java 复制代码
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

java 复制代码
<!-- 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>
相关推荐
叽哥1 小时前
Kotlin学习第 1 课:Kotlin 入门准备:搭建学习环境与认知基础
android·java·kotlin
风往哪边走2 小时前
创建自定义语音录制View
android·前端
用户2018792831672 小时前
事件分发之“官僚主义”?或“绕圈”的艺术
android
用户2018792831672 小时前
Android事件分发为何喜欢“兜圈子”?不做个“敞亮人”!
android
Kapaseker4 小时前
你一定会喜欢的 Compose 形变动画
android
QuZhengRong4 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
zhangphil5 小时前
Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin(2)
android·kotlin
程序员码歌12 小时前
【零代码AI编程实战】AI灯塔导航-总结篇
android·前端·后端
书弋江山13 小时前
flutter 跨平台编码库 protobuf 工具使用
android·flutter
来来走走15 小时前
Flutter开发 webview_flutter的基本使用
android·flutter