Android Architecture Components 是一组库,可帮助您设计健壮、可测试和可维护的应用程序。包含以下几个组件模块:
整体结构如下:
ViewModel负责View层和Repository层的数据管理; LiveData是一个可以保存数据和观察数据变化的组件; Room通过注解来控制实体和操作数据库 Paging是一个处理数据分页的组件
让普通类感知生命周期
Lifecycle 介绍
Lifecycle 组件指的是 android.arch.lifecycle 包下提供的各种类与接口,可以让开发者构建能感知其他组件(主要指Activity 、Fragment)生命周期(lifecycle-aware)的类。
LifeCycle的两个角色
如何使用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的原因有以下几点:
所以引入ViewModel之后,数据就可以从UI中分离出来,让每个模块的职责更加清晰合理。并且当Activity或Fragment重建的时候,ViewModel会自动保留之前的数据并给新的Activity或Fragment使用。
ViewModel生命周期
LiveData
LiveData 是一个可以保存数据和观察数据变化的组件。一句话总结:具有生命周期感知能力的弱化版(只是一个数据类型容器)Observable(RxJava)
Google帮我们实现了几种LiveData:
LiveData的优势:
Observer
跟LifecycleOwner
建立关系,从而可以获取生命周期状态,当组件生命周期状态为DESTROYED
时,会移除观察者。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