安卓开发——观察者模式的使用(ViewModel及MutableLiveData的使用)

本文介绍了观察者模式在Android中的应用,重点讲解了如何创建MyViewModel子类,使用MutableLiveData存储和更新数据,以及如何通过ViewModelProvider.Factory自定义实例。通过观察者模式监听数据变化并在合适时机执行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

观察者模式是什么?

1.创建ViewModel的子类myViewModel

2.创建MyViewModel并实例化


观察者模式是什么?

  • 你有一个变量,会有一个监听器去监听这个变量,当变量发生变化时监听器会触发并做出你想要的操作。

  • 其中,这个被监听的变量就是被观察的对象,当这个对象发生变化时我们可以触发回调并进行相应处理。

1.创建ViewModel的子类myViewModel
    public class MyViewModel extends ViewModel {
        private MutableLiveData<Integer> myVariable = new MutableLiveData<>(); //livedata的具体类,为可变livedata,可以更改并在观察者模式观察并随时更新

        public MyViewModel(){

        }
        public LiveData<Integer> getMyVariable() {
            return myVariable;
        }

        public void setMyVariable(int value) {
            //myVariable.setValue(value);
            myVariable.postValue(value); //postvalue用于在主线程更新value,避免产生异常
        }
    }

为什么要继承自ViewModel?

因为在Android中,ViewModel是用于管理UI相关数据和业务逻辑的类。它能帮助开发者在配置变化时保持数据一致性,避免生命周期导致一些数据异常等,能将数据存储在ViewModel中保证数据在配置变化时不会丢失。(相当于数据和活动分开了,但是又能保持通信)

MutableLiveData是什么?

这是一个继承自Livedata的存储数据的类,其中构造函数参数是T,所以你可以自定义数据类型。它可以在数据变化后通知回调函数。这就是我们需要被观察的那个变量。

getMyVariable和setMyVariable是什么?

这是用来获取我们实例化的那个被观察变量和给被观察变量赋值的。

其中,setValue()只能在主线程使用,而postValue()可以在其他线程使用,它会将这个操作提交到主线程的消息队列里。这两个方法都是用于更新被观察变量的。

2.创建MyViewModel并实例化
    public MyViewModel myViewModel;

    public class MyViewModelFactory implements ViewModelProvider.Factory {

          @NonNull
          @Override
          public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
                 if (modelClass.isAssignableFrom(MyViewModel.class)) {
                  return (T) new MyViewModel();
              }
              throw new IllegalArgumentException("Unknown ViewModel class");
          }
      }
    //onCreateView内
    myViewModel = new ViewModelProvider(this, new MyViewModelFactory()).get(MyViewModel.class);
    //onResume内
    myViewModel.getMyVariable().observe(this, new Observer<Integer>() {
    @Override
    public void onChanged(Integer value) {
            if (value == 1) {
                //执行你想在监听后进行的操作
                handler.postDelayed(Show_workmatesRunnable, 5000);
                myViewModel.setMyVariable(0);  
            }
        }
    });

    //其他要想执行监听回调的地方
    myViewModel.setMyVariable(1); 

我的系统默认的ViewModelProvider.Factory无法创建MyViewModel实例。所以需要自定义实例来处理ViewModel的创建。

实例化后就可以使用了。

使用livedata的observe方法就可以以观察者的方式监听数据变化了。

### Android ViewModel 使用教程和最佳实践 #### 一、ViewModel简介 `ViewModel` 是一种设计模式,旨在存储和管理与 UI 相关的数据。它允许数据在配置更改(如屏幕旋转)期间保持不变,从而提供更好的用户体验[^1]。 #### 二、基本使用方法 为了创建并使用 `ViewModel` ,开发者通常会继承自 `androidx.lifecycle.ViewModel` 类来定义自己的视图模型类: ```kotlin class MyViewModel : ViewModel() { private val _text = MutableLiveData<String>().apply { value = "This is a sample text" } val text: LiveData<String> = _text } ``` 上述代码展示了如何声明一个简单的 `MyViewModel` 实例,在其中封装了一个可观察的字符串变量 `_text` 。通过将其转换为不可变属性 `text` 对外暴露给Activity 或 Fragment 进行绑定显示[^2]。 #### 三、结合LiveData实现响应式编程 当希望监听来自服务器或其他异步源的变化时,可以利用 `LiveData<T>` 来构建具有生命周期感知能力的数据持有者对象。每当关联的 LifecycleOwner (比如 Activity/Fragment) 处于激活状态(`STARTED`, `RESUMED`)下发生改变,则自动触发更新UI操作而无需手动处理订阅取消等问题: ```kotlin // 在ViewModel内部 val user: MutableLiveData<User> fun fetchUser(userId: String){ // 模拟网络请求... viewModelScope.launch{ val result=repository.getUserByIdAsync(userId).await() user.postValue(result) } } // 在Activity或Fragment里 viewModel.user.observe(this, Observer { newUser -> binding.textViewName.text=newUser.name }) ``` 这里还涉及到协程的作用域管理问题——借助 `viewModelScope` 可以确保所有挂起函数都在合适的上下文中执行,并且会在宿主销毁前完成清理工作防止内存泄漏风险[^3]。 #### 四、遵循单一职责原则(SRP),引入Repository层隔离复杂度 为了避免让 `ViewModel` 承担过多责任,应该把具体的数据获取逻辑交给专门负责该任务的对象去完成—即 Repository 层。这样做不仅有助于提高程序结构清晰度,也方便单元测试阶段模拟不同场景下的输入输出行为而不必依赖真实环境: ```kotlin interface UserRepository { suspend fun getUserById(id:String):Result<User> } object FakeUserRepositoryImpl:UserRepository{ override suspend fun getUserById(id: String)= Result.success(User()) } class UserViewModel(private val userRepository:UserRepository):ViewModel(){ init{...}//注入方式省略 ... } ``` 以上就是关于Android平台下运用MVVM架构风格的一些核心概念和技术要点介绍[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值