Android MVVM架构模式,详详详细学习

MVVM(Model-View-ViewModel)

是一种基于数据绑定的架构模式,用于设计和组织应用程序的代码结构。它将应用程序分为三个主要部分:Model(模型)、View(视图)和ViewModel(视图模型)。

  • Model(模型):负责处理数据和业务逻辑。它可以是从网络获取的数据、数据库中的数据或其他数据源。Model层通常是独立于界面的,可以在多个界面之间共享。
  • View(视图):负责展示数据和与用户进行交互。它可以是Activity、Fragment、View等。View层主要负责UI的展示和用户输入的响应。
  • ViewModel(视图模型):连接View和Model,作为View和Model之间的桥梁。它负责从Model中获取数据,并将数据转换为View层可以直接使用的形式。ViewModel还负责监听Model的数据变化,并通知View进行更新。ViewModel通常是与View一一对应的,每个View都有一个对应的ViewModel。

MVVM的特点和优势

  1. 解耦合:MVVM通过将View和Model解耦合,使得它们可以独立开发和测试。ViewModel作为中间层,将数据从Model传递给View,避免了直接在View中处理业务逻辑的情况。
  2. 可维护性:MVVM的分层结构使得代码更易于维护。View只负责展示数据和用户交互,ViewModel负责处理业务逻辑和数据转换,Model负责数据的获取和存储。这种分离使得代码更加清晰和可读,也方便进行单元测试。
  3. 数据驱动UI:MVVM采用数据绑定的方式,将Model的数据与View进行绑定。当Model的数据发生变化时,ViewModel会自动更新View的显示,无需手动更新UI。这种方式可以减少手动更新UI的代码量,提高开发效率。
  4. 可测试性:由于MVVM的分层结构和数据驱动UI的特点,可以更容易地进行单元测试。ViewModel中的业务逻辑可以独立于View进行测试,而不需要依赖于Android系统或UI组件。

常见架构模式(MVC和MVP)区别

  • MVC(Model-View-Controller):MVC模式中,Controller负责处理用户输入和业务逻辑,Model负责数据和业务逻辑,View负责展示数据。与MVC相比,MVVM将Controller分离为ViewModel,将数据绑定的方式集成进来,使得代码更加简洁和清晰。
  • MVP(Model-View-Presenter):MVP模式中,Presenter负责处理用户输入和业务逻辑,Model负责数据和业务逻辑,View负责展示数据。与MVP相比,MVVM将Presenter分离为ViewModel

MVVM三个核心组件

在MVVM模式中,有三个核心组件:Model(模型)、View(视图)和ViewModel(视图模型)。它们各自具有不同的职责和作用,并通过数据绑定机制实现彼此之间的关系和交互。

Model(模型):

  • 职责:负责处理数据和业务逻辑。它可以是从网络获取的数据、数据库中的数据或其他数据源。Model层通常是独立于界面的,可以在多个界面之间共享。 - 作用:提供数据和处理数据的方法,封装业务逻辑。 - 示例代码:

    java public class User { private String name; private int age; // getter and setter methods // 数据获取的方法 public LiveData getUser() { // 从网络或数据库获取用户数据 return userRepository.getUser(); } // 数据更新的方法 public void updateUser(User user) { // 更新用户数据 userRepository.updateUser(user); } // ... }

View(视图):

  • 职责:负责展示数据和与用户进行交互。它可以是Activity、Fragment、View等。View层主要负责UI的展示和用户输入的响应。 - 作用:将ViewModel中的数据展示给用户,并将用户的输入传递给ViewModel。 - 示例代码:

    java public class MainActivity extends AppCompatActivity { private UserViewModel userViewModel; private TextView nameTextView; private TextView ageTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nameTextView = findViewById(R.id.nameTextView); ageTextView = findViewById(R.id.ageTextView); userViewModel = new ViewModelProvider(this).get(UserViewModel.class); userViewModel.getUser().observe(this, user -> { // 更新UI显示 nameTextView.setText(user.getName()); ageTextView.setText(String.valueOf(user.getAge())); }); } // 处理用户输入的方法 public void onUpdateUserClick(View view) { // 从UI获取用户输入 String name = nameEditText.getText().toString(); int age = Integer.parseInt(ageEditText.getText().toString()); // 更新ViewModel中的数据 User user = new User(name, age); userViewModel.updateUser(user); } // ... }

ViewModel(视图模型):

  • 职责:连接View和Model,作为View和Model之间的桥梁。它负责从Model中获取数据,并将数据转换为View层可以直接使用的形式。ViewModel还负责监听Model的数据变化,并通知View进行更新。ViewModel通常是与View一一对应的,每个View都有一个对应的ViewModel。 - 作用:处理View层的数据展示和用户交互,并与Model层进行交互。 - 示例代码:

    java
    public class UserViewModel extends ViewModel {
    private User user;
    private UserRepository userRepository;

    • public UserViewModel() {
    • userRepository = new UserRepository();
    • user = new User();
    • }

    • // 获取数据的方法 public LiveData<User> getUser() {
    • return user.getUser();
    • }

    • // 更新数据的方法
    • public void updateUser(User user

    ) {
    user.updateUser(user);
    }

    // ...
    }

ViewModel通过数据绑定机制将Model的数据与View进行绑定,实现数据的自动更新。当Model的数据发生变化时,ViewModel会自动通知View进行更新。这种数据绑定的方式减少了手动更新UI的代码量,提高了开发效率。

下面是一个示意图,说明了MVVM模式中Model、View和ViewModel之间的关系和交互方式:

复制代码
        +-------------+
        |    Model    |
        +-------------+
              |
              |
              v        +-------------+
        |  ViewModel  |
        +-------------+
              |
              |
              v
        +-------------+
        |     View    |
        +-------------+

在这个示意图中,ViewModel通过数据绑定机制将Model的数据绑定到View上,当Model的数据发生变化时,ViewModel会自动通知View进行更新,从而实现UI的自动刷新。用户的输入通过View传递给ViewModel,ViewModel再将数据传递给Model进行处理。

通过MVVM模式,Model、View和ViewModel之间的分离和解耦合,使得代码更易于维护和测试。ViewModel作为中间层,负责处理业务逻辑和数据转换,使得View层只关注UI的展示和用户交互,而不关心具体的业务逻辑和数据处理。这种分层结构和数据绑定的方式使得代码更加清晰、可读性更强,并提高了开发效率和代码质量。

MVVM数据绑定机制

在MVVM模式中,数据绑定是实现View和ViewModel之间数据同步的关键机制。它允许将View中的UI元素(如TextView、EditText)与ViewModel中的数据属性进行绑定,当数据发生变化时,自动更新UI,同时用户的输入也会自动同步到ViewModel中。

数据绑定的原理是通过观察者模式和反射机制实现的。当ViewModel中的数据发生变化时,会触发相应的通知,通知绑定的View进行更新。而当用户在View中输入数据时,数据绑定也会将输入的数据自动同步到ViewModel中。这种双向的数据同步机制,使得View和ViewModel之间实现了数据的实时同步。

在Android中,可以使用数据绑定库(如Data Binding)来实现MVVM模式中的数据绑定。Data Binding库提供了一组注解和工具类,可以简化数据绑定的实现过程。

以下是在Android中使用Data Binding库实现MVVM模式中的数据绑定的步骤:

  1. 配置Data Binding库:在项目的build.gradle文件中,添加Data Binding的插件和依赖项。

    复制代码
     // ...
     dataBinding {
         enabled = true
     }

    }

    dependencies {
    // ...
    implementation 'androidx.databinding:databinding-runtime:7.0.2'
    }

  2. 创建布局文件:在布局文件中,使用标签包裹布局,并使用标签定义绑定的变量和表达式。

    复制代码
     <data>
         <variable            name="user"
             type="com.example.mvvm.User" />
     </data>
     <LinearLayout        android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:orientation="vertical">
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@{user.name}" />
         <TextView            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@{String.valueOf(user.age)}" />
     </LinearLayout>
    </layout>
  3. 创建ViewModel类:创建一个与View对应的ViewModel类,并在其中定义与布局文件中绑定的变量。

    java
    public class UserViewModel extends BaseObservable {
    private String name;
    private int age;

    // getter and setter methods

    @Bindable public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    notifyPropertyChanged(BR.name);
    }

    @Bindable public int getAge() {
    return age;
    }

    public void setAge(int age) {
    this.age = age;
    notifyPropertyChanged(BR.age);
    }
    }

  4. 绑定数据:在Activity或Fragment中,使用DataBindingUtil类将布局文件与ViewModel进行绑定,并设置ViewModel的数据。

    public class MainActivity extends AppCompatActivity {
    private UserViewModel userViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // 创建ViewModel实例
    userViewModel = new UserViewModel();
    userViewModel.setName("John");
    userViewModel.setAge(25);

    // 绑定ViewModel和

    布局文件 ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    binding.setUser(userViewModel);
    }
    }

通过以上步骤,我们将布局文件和ViewModel进行了绑定,同时设置了ViewModel的数据。当ViewModel中的数据发生变化时,布局文件中相应的UI元素会自动更新。同时,当用户在UI元素中输入数据时,Data Binding库也会自动将输入的数据同步到ViewModel中。

使用数据绑定的好处是能够简化代码,减少手动更新UI的代码量,提高开发效率。它还能够降低代码的耦合性,使得UI和数据逻辑的修改更加灵活和独立。另外,数据绑定还能够提高代码的可读性和可维护性,使得代码更易于理解和调试。《更多内容可查了主页信息,可捕获进阶知识》

MVVM架构模式发展趋势

MVVM模式在Android开发中已经得到广泛应用,并且在未来仍然有着较大的发展潜力。以下是一些未来发展趋势:

Jetpack Compose:

Jetpack Compose是Google推出的一种全新的UI框架,它采用了声明式UI的方式,与MVVM模式非常契合。Jetpack Compose能够简化UI开发流程,提供更加灵活和响应式的UI编程方式。

数据驱动UI:

未来,数据驱动UI的概念将会更加普及和强调。MVVM模式的数据绑定和观察者模式是实现数据驱动UI的重要手段,未来可能会有更多的框架和工具出现,进一步简化数据和UI的绑定过程。

更强大的ViewModel组件:

Android Jetpack中的ViewModel组件已经为开发者提供了很多便利,但未来可能会有更多功能和特性被添加进来,以进一步提高ViewModel的灵活性和可扩展性。

跨平台开发:

MVVM模式的解耦特性使得代码更具可移植性,未来可能会有更多的跨平台开发框架和工具出现,使得开发者能够更轻松地在不同平台上使用MVVM模式进行开发。

相关推荐
SimonKing15 小时前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
Mintopia15 小时前
在深与广之间:产品、架构与开发如何为业务场景做权衡
架构
二流小码农15 小时前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少16 小时前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker16 小时前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋17 小时前
Android 协程时代,Handler 应该退休了吗?
android
NineData1 天前
NineData 迁移评估功能正式上线
数据库·dba
火柴就是我1 天前
让我们实现一个更好看的内部阴影按钮
android·flutter
炫饭第一名1 天前
速通Canvas指北🦮——基础入门篇
前端·javascript·程序员
NineData1 天前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算