使用Lifecycle-Aware组件优化项目

组件介绍

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接口很简单,如下:

public interface LifecycleOwner {
       Lifecycle getLifecycle();
}

如何使用LifeCycleObserver

生命周期观察者需要实现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");
    }}

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

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)

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

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使用姿势很简单:

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 可以像下面这样访问列表:

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 ):

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

近期文章:

等等,先别走!「码个蛋」又有活动了!参与活动不但可以培养自己的好习惯,还能拿到「码个蛋」IP系列专属奖品,速度要快...

 戳我看详情 

今日问题:

是否有使用Google这套LifeCycle组件,感觉如何?

留言格式:

打卡 天,答:xxx

告诉你一个小技巧:

只需3步,你将不会错过任何一篇文章!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值