首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AAC---LifeCycle

AAC---LifeCycle

作者头像
None_Ling
发布2018-10-24 14:42:52
5900
发布2018-10-24 14:42:52
举报
文章被收录于专栏:Android相关Android相关

LifeCycle介绍

LifeCycle最主要解决的问题是在Activity或者Fragment的生命周期中功能与页面状态之间的关系,以及对于功能太多时,onResume以及onPause等生命周期函数太臃肿产生的。

LifeCycle的使用

  1. 根据需要添加LifeCycle的配置项
dependencies {
    def lifecycle_version = "1.1.1"

    // ViewModel and LiveData
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
    // alternatively - just ViewModel
    implementation "android.arch.lifecycle:viewmodel:$lifecycle_version" // use -ktx for Kotlin
    // alternatively - just LiveData
    implementation "android.arch.lifecycle:livedata:$lifecycle_version"
    // alternatively - Lifecycles only (no ViewModel or LiveData).
    //     Support library depends on this lightweight import
    implementation "android.arch.lifecycle:runtime:$lifecycle_version"

    annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
    // alternately - if using Java8, use the following instead of compiler
    implementation "android.arch.lifecycle:common-java8:$lifecycle_version"

    // optional - ReactiveStreams support for LiveData
    implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"

    // optional - Test helpers for LiveData
    testImplementation "android.arch.core:core-testing:$lifecycle_version"
}
  1. 实现LifecycleObserver 接口,定义该功能能力,并且通过OnLifecycleEvent标注该能力对应的生命周期
public class LifeCycleListener implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void startLocation() {
      // Do Something
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void stopLocation() {
      // Do Something
    }
}
  1. 在Activity/Fragment中注册Observer
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DataBindingUtil.setContentView(this, R.layout.activity_main);
        getLifecycle().addObserver(new LifeCycleListener());
    }

}

PS:

  • lifecycle.getCurrentState().isAtLeast(STARTED)可以用来判断当前页面的状态

DIV实现LifeCycle

在26.1.0之后Support Lib中的Activity以及Fragments都已经实现了LifeCycleOwner接口,如果没有使用AppComaptActivity的话,可以自己实现一套LifeCycle。

将Activity与Fragment实现LifeCycleOwner接口,并且在内部创建LifecycleRegistry对象,在生命周期的回调函数中标记当前状态即可。

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;
    }
}

LifeCycle的最佳实践

  • 尽量保持UI Controller(Activity以及Fragment)的精简。UI Controller不应该获取数据,而应该使用ViewModel获取数据,并且使用LiveData来监听数据的变化,并且把变化的数据告知View。
  • 尽量使用数据驱动UI(data-driven UI)的方式,而UI Controller的作用应该是当数据变化的时候更新View,或者将用户Action告知ViewModel
  • 将数据逻辑放到ViewModel中。ViewModel应该充当UI Controller与APP其他部分的桥梁,它应该获取数据,并且回调给UI Controller。
  • 使用 Data Binding保持View与UI Controller之间的整洁,它可以让View更加清楚,并且在Activity和Fragment中的代码更少
  • 如果UI很复杂的话,可以考虑使用MVP模式来处理UI更新
  • 禁止在ViewModel中使用Context以及Activity,因为这样很容易导致Activity泄露,并且不会被GC回收

参考资料

Handling lifecycles with lifecycle-aware components

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.06.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • LifeCycle介绍
  • LifeCycle的使用
  • DIV实现LifeCycle
  • LifeCycle的最佳实践
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档