引言
JetPack库中的成员有很多,我们由简入繁~首先从我们最熟知的Activity和Fragment的生命周期组件入手。它可是伴随我们的application最密切的伙伴啊!对它有一定了解才能更好的使用Activity和Fragment,从而实现我们代码的业务逻辑。正所谓磨刀不误砍柴工,就是这个道理!
本期我们一起来学习JetPack库中的成员:LifeCycle。人如其名,生命周期。
介绍:
LifeCycle是GoogleApp架构中推荐的一个组件。
Lifecycle 在每个相关的组件中使用两个枚举类来追踪生命周期状态:
(1)Event(事件)
由framework和 Lifecycle 类分发的生命周期事件。
(2)State(状态)
Lifecycle 类持有的当前组件的状态。
作用:
简单的说就是用来监听Activity与Fragment的生命周期变化。
在生命周期拥有者与生命周期的观察者之间快速方便的建立一种联系。在生命周期拥有者的生命周期变化时,观察者会收到对应的通知。可以方便的判断当前生命周期拥有者所处在的生命周期状态。
图示
使用场景
自定义View需要对页面生命周期变化进行对应的处理,如动画的开始和结束,页面销毁时释放资源等。这种情况下,同样需要在Activity或Fragment的生命周期回调中调用View的各个方法。
如何使用
LifeCycleOwner
AppCompatActivity与V4中的Fragment都已默认实现了LifeCyclerOwner接口,所以可以直接使用。LifeCyclerOwner接口很简单,如下:
public interface LifecycleOwner {
Lifecycle getLifecycle();
}
LifeCycleObserver
生命周期观察者需要实现LifeCycleObserver接口,这个接口没有任何方法。那他如何对生命周期进行观察呢?答案是依赖注解-->OnLifecycleEvent。
@SuppressWarnings("WeakerAccess")
public interface LifecycleObserver {
}
「注解内部实现」
@SuppressWarnings("unused")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnLifecycleEvent {
Lifecycle.Event value();
}
最终LifeCycleObserver的实现类如下
public class MyLifeCycleObserver implements LifecycleObserver{
private static final String TAG="MyLifeCycleObserver";
public MyLifeCycleObserver() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onActivityResume(){
Log.d(TAG,"onActivityResume");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onActivityPause(){
Log.d(TAG,"onActivityPause");
}
}
这里LifeCycleObserver对LifeCycleOwner的ON_RESUME和ON_PAUSE方法进行了观察,在LifeCycleOwner的生命周期产生变化的时候会调用LifeCycleObserver中注解修饰的方法。
两个角色定义好后,需要让他们之间建立联系
很简单,一行代码即可。上面说过了AppCompatActivity已经实现了LifeCycleOwner接口。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(new MyLifeCycleObserver());
}
}
运行过后,在Activity
OnResume和OnPause的时候,就会Log出对应的信息。
此外
判断当前处在的生命周期
Lifecycle允许其他的对象判断当前的生命周期状态。方法如下
if (lifecycle.getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
// do something After Started
}
这个方法不是用来判断是否处于某个状态,而且用来判断是否到达了某个状态。
自定义LifecycleOwner
上面说了,AppCompatActivity与V4中的Fragment都已默认实现了LifeCyclerOwner接口,基本上可以应对所有的情况了,并且,自定义LifecycleOwner方法也比较简单,就直接贴代码了。
public class MyActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLifecycleRegistry = new LifecycleRegistry(this);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@Override
public void onStart() {
super.onStart();
mLifecycleRegistry.markState(Lifecycle.State.STARTED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
生命周期感知型组件的最佳实践
第一:
尽量保持你的UI控制器尽量精简,他们不应该自己去请求处理数据,应该使用ViewModel去处理数据,观察一个LiveData对象,并且将数据变化反应到视图上。
第二:
尝试使用数据驱动型的UI,你的UI控制器相应数据变化,并且改变view ,或者通知user返回ViewModel
第三:
将你的数据逻辑放入ViewModel。ViewModel应该作为你的UI控制层和其他层的连接器,但是请狐疑获取网络数据不是viewmodel的职责.相反viewmodel 应该让组件去获取数据,然后处理结果返回给UI控制层。
第四:
使用Data Binding 来在view和UI控制层直接维护一个简洁的接口.这可以允许你讲view更多的是声明式的,最小化更新代码.如果你想要这么做,可以使用Butter Knife 来获得更好的抽象。
第五:
如果你的UI界面相对复杂,考虑创建一个presenter 来处理UI 变化,这么做可能看起来工作量提升不少,不过这个让你的UI组将更容易测试。
第六:
在ViewModel中避免使用view,activity,fragment的,这样可以避免内存泄露。