前面学习的是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);
}