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();
}
}
实现效果图