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>
相关推荐
其实防守也摸鱼9 小时前
Fastjson 反序列化漏洞(JNDI注入)
android·数据库·安全·oracle·自动化·fastjson·反序列化
狗凯之家源码网11 小时前
微博图床 PHP 系统搭建与实战应用指南
android·开发语言·php
消失的旧时光-194312 小时前
(第一篇)JNI 多线程到底难在哪:从 Linux Thread 到 JNIEnv
android·jni·ndk
逗脑IDE14 小时前
零基础学ESP32:蓝牙控制舵机——手机一点,舵机就转!
android·智能手机
清霜之辰15 小时前
骁龙 8397 舱驾融合平台端侧大模型部署:7B 模型本地推理与 64GB 内存账本
android
烽火聊员15 小时前
Android屏幕卡顿traces.txt拉取查看
android·java·android studio
只睡四小时17 小时前
JS 手写 D-pad 空间导航:电视端焦点引擎实战
android·开发语言·前端·javascript·ecmascript·hls·空间导航
恋猫de小郭17 小时前
Android 原生的 Compose A2UI 也来了,你还抱着 XML 养老吗?
android·前端·flutter
程序媛_17 小时前
【JMeter】准备token文件
android·jmeter
维克兜率天17 小时前
【维克】弹性策略:用“乖离率“捕捉超跌反弹
android·开发语言·python·深度学习·kotlin·量化