ViewModel + LiveData

本文探讨了ViewModel在Android开发中的重要性,特别是如何通过LiveData实现实时数据变化通知,以及如何简化Activity中的代码。通过实例展示了如何创建ViewModel和使用 MutableLiveData进行计时器操作,并在Activity中观察数据更新。

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

JetPack----ViewModel

Blog如有不对,敬请斧正

ViewModel诞生

写代码时候常出现一下问题,进而有了ViewModel的诞生,体现了其对Android开发的重要性

1、瞬态数据会丢失 比如屏幕旋转,当Activity或者Fragment创建了关联的ViewModel,那么该Activity或Fragment只要处于活动状态,那么该ViewModel就不会被销毁

2、异步调用可能会导致内存泄漏 比如该对象已经使用不到它 但是他又占用了内存 导致GC无法回收

3、Activity 里面写的代码太臃肿包含逻辑、UI刷新、控件实例化等 导致后面的维护困难 并且没有体现Activity单一职责的原则

ViewModel作用

1、它是介于视图和数据模型之间的桥梁 即视图和数据的交互要通过ViewModel 视图的话就是显示在界面的布局控件 数据可以是sqlite的数据也可以是网络请求获得的数据

2、 ViewModel用来管理UI的数据,使视图和数据能够分离

3、它可以用来管理Activity和Fragment中的数据.还可以拿来处理Fragment与Fragment之间的通信等等.

JetPack----LiveData


LiveData简介

1、单单使用ViewModel并不能体现其强大性,加上了LiveData才赋予了其灵魂

2、LiveData的作用:在ViewModel中的数据发生变化时会去通知页面利用ViewModel就可以达到数据共享与和通信作用

3、LiveData为抽象类,通常使用其子类MutableLiveData

使用

1、创建ViewModelTest继承自ViewModel,ViewModelTest中设置一个计时器改变MutableLiveData 的数据,计时器主要是体现的是 数据的改变,该数据可以是数据库或网络中的数据,这里简单演示

2、getValue()获取MutableLiveData数据 ,设置数据 步线程用postValue() UI线程可以用setValue()

3、在ActivityTest中ViewModelTest中使用MutableLiveData并展示计时器改变后的数据

4、具体请看代码

5、这样子就可以简化Acivity中的代码 --JetPack系列持续更新中–

ViewModelTest.java

package com.myjetpack.livedata;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

import java.util.Timer;
import java.util.TimerTask;

/**
 * Date:2021/5/9
 * Blog:https://blog.youkuaiyun.com/weixin_44758662
 */
public class ViewModelTest extends ViewModel {
    private MutableLiveData<Integer> time;

    public MutableLiveData<Integer> getTime() {
        if (time == null) {
            time = new MutableLiveData<>();
            time.postValue(0); //初始化一下
        }
        return time;
    }

    /**
     * //开启计时器
     */
    public void starTime() {
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                //异步线程用postValue() UI线程可以用setValue()
                time.postValue(time.getValue() + 1);
            }
        }, 1000, 1000);
    }
}

ActivityTest.java

package com.myjetpack.livedata;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

import android.os.Bundle;
import android.widget.TextView;

import com.myjetpack.R;

/**
 * Date:2021/5/9
 * Blog:https://blog.youkuaiyun.com/weixin_44758662
 */
public class ActivityTest extends AppCompatActivity {
    private ViewModelTest viewModelTest;
    private TextView tvTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_live_data);
        tvTime = findViewById(R.id.tv_time);
        //获取实例并绑定
        viewModelTest = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(ViewModelTest.class);

        //观察者模式 当观察到数据改变时 执行onChanged里的方法
        viewModelTest.getTime().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                //此时 integer 等于 myViewModel.getTime().getValue()
                tvTime.setText(String.valueOf(integer));
            }
        });
        //开启计时器 开启后上条语句就会观察到更新的数据 ,之后就会更新tvTime
        viewModelTest.starTime();
    }
}

实现效果图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_jiaaang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值