➤ Jetpack 笔记 LifeCycle ViewModel 与LiveData的了解

前面学习的是Kotlin 接下来就学习Jetpack ,Jetpack 是一个由多种库组成的套件。我的想法是将 Kotlin+ Jetpack 灵活的运用起来。

LifeCycle

LifeCycle 生命周期的管理的小Demo,使用了Lifecycle就不需要在Activity中在OnResume() 、OnPause() 方法中去重写业务逻辑了。

public class MyChronometer extends Chronometer implements LifecycleObserver {
    private long elapsedTime;
    public MyChronometer(Context context, AttributeSet attrs) {
        super(context,attrs);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    private void startMeter() {
        setBase(SystemClock.elapsedRealtime() - elapsedTime);
        start();
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    private void stopMeter() {
        elapsedTime = (SystemClock.elapsedRealtime() - getBase());
        stop();
    }
    
}

Activity 中的代码

private MyChronometer chronometer;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    chronometer = findViewById(R.id.ct);
    getLifecycle().addObserver(chronometer);
}

LifeCycle的优势
帮助开发者建立可感知的生命周期组件
组件在其内部管理自己的声明周期,从而降低模块耦合度
降低内存泄露发生的可能性
activity Fragment Service Application 均有 LifeCycle的支持

ViewModel

ViewMdeld的诞生
(1)解决瞬态数据的丢失
(2)防止异步调用的内存泄露
(3)降低类膨胀提高维护难度和测试难度

ViewModel的作用
介于View 视图 和Model数据模型之间的桥梁,使视图和数据能够分离,也能保持通信‘

在这里插入图片描述

ViewModel 生命周期特性 独立于配置的变化

在这里插入图片描述
ViewModel Deom 代码如下

public class MyViewModel extends ViewModel {

    public int number ;
}

Activity 中的代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_step_one);
    textView = findViewById(R.id.tv_one);
    myViewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModel.class);
    textView.setText(String.valueOf(myViewModel.number));
}

public void plusNumber(View view){
    //点击按钮功能
    textView.setText(String.valueOf(++myViewModel.number));
}

AndroidViewModel
不要向ViewModel中传入Context,会导致内存泄露
如果要使用Context 请使用AndroidViewModel中的Application

LiveData

LiveData的优势:

确保页面符合数据状态
不会发展内存泄露
不会因Activity停止而导致崩溃
不在需要手动处理生命周期
数据始终保持最新状态
适当的配置更改
共享资源

LiveData和ViewModel 之间的关系
在ViewModel中的数据发生变化时通知页面

![在这里插入图片描述](https://img-blog.csdnimg.cn/50b864c6b9ac4b79849cbd3e95a9f343.png

LiveData +ViewModel 小Demo

MyViewModel 使用MutableLiveData

public class MyViewModel  extends ViewModel {
    
    private MutableLiveData<Integer> currentSecond;
    public MutableLiveData<Integer> getCurrentSecond() {
        if (currentSecond==null){
            currentSecond = new MutableLiveData<>();
            currentSecond.setValue(0);
        }
        return currentSecond;
    }
}

Main 主要逻辑

textView = findViewById(R.id.tv_view);
viewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModel.class);
textView.setText(String.valueOf(viewModel.getCurrentSecond().getValue()));
startTimer();
viewModel.getCurrentSecond().observe(this, new Observer<Integer>() {
    @Override
    public void onChanged(Integer integer) {
        textView.setText(String.valueOf(integer));
    }
});

startTimer 方法
非UI线程 使用postValue UI线程使用 setValue

private void startTimer() {
    new Timer().schedule(new TimerTask() {
        @Override
        public void run() {
            //非UI线程 使用postValue  UI线程使用 setValue
            viewModel.getCurrentSecond().postValue(viewModel.getCurrentSecond().getValue() + 1);
        }
    }, 1000, 1000);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值