栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

➤ Jetpack 笔记 LifeCycle ViewModel 与LiveData的了解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

➤ Jetpack 笔记 LifeCycle ViewModel 与LiveData的了解

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

文章目录
    • LifeCycle
    • ViewModel
    • LiveData

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 currentSecond;
    public MutableLiveData 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() {
    @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);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/936701.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号