前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Lifecycle-Aware组件优化项目

使用Lifecycle-Aware组件优化项目

作者头像
陈宇明
发布2020-12-16 09:44:28
9170
发布2020-12-16 09:44:28
举报
文章被收录于专栏:设计模式
组件介绍

Android Architecture Components 是一组库,可帮助您设计健壮、可测试和可维护的应用程序。包含以下几个组件模块:

  • lifecycle 处理生命周期,创建一个自动响应生命周期事件的用户界面
  • LiveData 构建底层数据库更改时通知试图的数据对象(数据驱动界面)
  • ViewModel 存储未在应用旋转中销毁的UI相关数据
  • Room 使用应用内对象和编译时检查来访问您的应用的SQLite数据库
  • Paging 逐步从数据源加载所需的信息

整体结构如下:

ViewModel负责View层和Repository层的数据管理; LiveData是一个可以保存数据和观察数据变化的组件; Room通过注解来控制实体和操作数据库 Paging是一个处理数据分页的组件

让普通类感知生命周期

Lifecycle 介绍

Lifecycle 组件指的是 android.arch.lifecycle 包下提供的各种类与接口,可以让开发者构建能感知其他组件(主要指Activity 、Fragment)生命周期(lifecycle-aware)的类。

LifeCycle的两个角色

  • LifeCycleOwner 生命周期拥有者,即Activity与Fragment(也可自定义,但局限性大)
  • LifeCycleObserver 生命周期观察者,可以是任何类,常见的有mvp的p,自定义View等

如何使用LifeCycleOwner

AppCompatActivity与V4中的Fragment都已默认实现了LifeCyclerOwner接口,所以可以直接使用。LifeCyclerOwner接口很简单,如下:

代码语言:javascript
复制
public interface LifecycleOwner {
       Lifecycle getLifecycle();
}

如何使用LifeCycleObserver

生命周期观察者需要实现LifeCycleObserver接口,这个接口没有任何方法。对于日常使用我们只需继承该接口:

代码语言:javascript
复制
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");
    }}

这样一个具备感知view层生命周期的类创建完成了,这里我们只需使用如下类似注解就可以监听到view的相关生命周期方法:

代码语言:javascript
复制
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)

然后,需要让View和这个组件进行关联:

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getLifecycle().addObserver(new MyLifeCycleObserver());
    }}

使用ViewMode管理数据

ViewModel是以关联生命周期的方式来存储和管理UI相关的数据的类,即使configuration发生改变(比如旋转屏幕),数据仍然可以存在不会销毁。

引入ViewModel的原因有以下几点:

  • Activity或Fragment这类应用组件都有自己的生命周期,他们的生命周期都是被Framework所管理。Framework可能会根据用户的一些操作以及设备的状态对Activity或Fragment进行销毁和重建。作为开发者,这些行为我们是无法干预的。伴随着Activity或Fragment的销毁和重建,它们当中的数据也会随着一起销毁和重建。对于一些简单的数据,Activity可以使用onSaveInstanceState()方法,并从onCreate的bundle中重新获取,但这一方法仅仅适合一些简单的UI状态,对于列表型这种庞大的数据类型并不适合
  • Activity或Fragment经常会做一些异步的耗时操作,随之就需要管理这些异步操作得到的数据,并在destroyed的时候清理它们,从而避免内存溢出这类问题的发生。但是这样的处理会随着项目扩大而变得十分复杂
  • Activity或Fragment本身需要处理很多用户的输入事件并和操作系统打交道,当它们还要花时间管理那些数据资源时,它们所在的类就会变得异常庞大,造就出所谓的god activities和god fragments,这样很尴尬

所以引入ViewModel之后,数据就可以从UI中分离出来,让每个模块的职责更加清晰合理。并且当Activity或Fragment重建的时候,ViewModel会自动保留之前的数据并给新的Activity或Fragment使用。

ViewModel生命周期

LiveData

LiveData 是一个可以保存数据和观察数据变化的组件。一句话总结:具有生命周期感知能力的弱化版(只是一个数据类型容器)Observable(RxJava)

Google帮我们实现了几种LiveData:

  • MutableLiveData暴露公用的setValue(T)和postValue(T)方法
  • ComputableLiveData可以根据需要对数据进行计算
  • MediatorLiveData可以用来正确的处理其他多个LiveData的事件变化,并处理这些事件。

LiveData的优势:

  1. 确保数据源跟UI展示一致——当数据源变化时,LiveData会通知观察者更新UI,前提是组件在激活状态下。
  2. 不会造成内存泄露——由于ObserverLifecycleOwner建立关系,从而可以获取生命周期状态,当组件生命周期状态为DESTROYED时,会移除观察者。
  3. 当组件处于非激活状态时,不会收到数据更新回调。
  4. 无需手动处理生命周期——UI组件只需要观察对应的数据,LiveData根据其生命周期自动处理。
  5. 总是最新的数据——当Activity从后台切到前台时,总会收到最新的数据。
  6. 适配设备配置变化——如屏幕旋转,组件销毁重建后,立即收到上次的数据。
  7. 资源共享——Activity和Fragment之间数据共享。

ViewModel配合LiveData使用姿势很简单:

代码语言:javascript
复制
public class MyViewModel extends ViewModel {
    private MutableLiveData<List<User>> users;
    public LiveData<List<User>> getUsers() {
        if (users == null) {
            users = new MutableLiveData<List<Users>>();
            loadUsers();
        }
        return users;
    }
    private void loadUsers() {
        // 执行异步操作获取用户
    }
}

现在 activity 可以像下面这样访问列表:

代码语言:javascript
复制
public class MyActivity extends AppCompatActivity {
   public void onCreate(Bundle savedInstanceState) {
       MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
       model.getUsers().observe(this, users -> {
           // 更新 UI
       });
   }
}

使用LifeCycle组件优化项目

1、不需要再去写那些类似调用并且会导致 onCreate() 和 onDestroy() 臃肿的方法。例如:那些需要在 onCreate 方法中初始化,在 onStop 进行一些处理,onDestoty 进行释放的操作。(MVP 中的 Presenter,MediaPlayer等)。

2、在高精度和低精度地理位置之间的切换.使用生命周期感知型的组件能够使用高精度获取地理位置在你的APP可见时候,当你的APP切换到后台的时候使用低精度更新.

3、启动和关闭视频缓冲.使用生命周期感知型组件来打开视频缓冲.你也可以在在app关闭的时候关闭视频缓冲.

4、启动和关闭网络连接.使用生命周期感知型组件能够允许app在前台时候更新网络数据,在app在后台时候自动暂停.

5、暂停和重启动画

最后附上最新依赖路径(Pre-AndroidX ):

代码语言:javascript
复制
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" // use kapt for Kotlin
   // 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"
}

最新AndroidX依赖请查阅Google官方文档:

https://developer.android.com/topic/libraries/architecture/adding-components#lifecycle

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码个蛋 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档