Android 架构组件简单小结
来源:互联网 发布:淘宝推广自己买领佣金 编辑:程序博客网 时间:2024/06/05 19:37
Android官方提供了一组架构组件(Android Architecture Components)用来帮助开发者创建健壮、易测试和可维护的apps。包括Lifecycle、LiveData、ViewModel和Room Persistence Library。
Lifecycle
Lifecycle是一个包含组件(比如Activity或者Fragment)生命周期信息的类。Lifecycle用两种枚举来表示相关联的生命周期的状态。
- Event
State
LifecycleObserver通过对方法添加注解的方式来监听组件的生命周期。
public class MyObserver implements LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void onResume() { } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) public void onPause() { }}aLifecycleOwner.getLifecycle().addObserver(new MyObserver());
LifecycleOwner
LifecycleOwner是一个只包含getLifecycle()方法的接口,表示这这个一个包含Lifecycle。LifecycleActivity 和 LifecycleFragment已经实现了这个接口,也可以在自定义的类中实现这个接口,不过这时候需要自己发送生命周期事件。
/** * Activity that implements {@link LifecycleOwner}. * <p> * This class is a temporary implementation detail until Lifecycles are integrated with support * library. */public class LifecycleActivity extends FragmentActivity implements LifecycleRegistryOwner { private final LifecycleRegistry mRegistry = new LifecycleRegistry(this); @Override public LifecycleRegistry getLifecycle() { return mRegistry; }}
ViewModel
ViewModel是用来存储UI相关的数据,使得数据不受配置变化影响(比如旋转屏幕)。
public class SharedViewModel extends ViewModel { private final MutableLiveData<Item> selected = new MutableLiveData<Item>(); public void select(Item item) { selected.setValue(item); } public LiveData<Item> getSelected() { return selected; }}public class MasterFragment extends Fragment { private SharedViewModel model; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class); itemSelector.setOnClickListener(item -> { model.select(item); }); }}public class DetailFragment extends LifecycleFragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class); model.getSelected().observe(this, { item -> // update UI }); }}
上面的例子可以看出ViewModel可以很方便的实现在Fragment之间传递数据。
ViewModel在配置信息变化时仍然保存着信息,因此它不应该包含任何的context相关的引用(需要applicationContext可以继承AndroidViewModel)。同时ViewModel也是有相应的生命周期,在我们自己的Activity销毁的时候会回调 onCleared()来清除资源。
ViewModel vs SavedInstanceState
ViewModels提供了一种方便的方法来在配置更改中保留数据,但如果应用程序被操作系统杀死,则不会持久保存数据。 例如,如果用户离开应用程序并在几个小时后返回,该进程将在此期间被杀死,而Android操作系统将从被保存的状态恢复活动。所有框架组件(视图、活动、片段)都使用保存的实例状态机制来保存它们的状态,所以大多数情况下,您不需要做任何事情。您可以使用onSaveInstanceState回调将自定义数据添加到这个bundle中。 通过onSaveInstanceState保存的数据是保存在系统进程内存并Android操作系统允许你只保留少量的数据,所以这不是保存应用程序实际数据的好地方。
LiveData
LiveData是一个保存可以被观察的数据类,包含app组件的lifecycle。
如果Observer的生命周期处于STARTED or RESUMED,LiveData认为观察者处于活动状态。
public class LocationLiveData extends LiveData<Location> { private static LocationLiveData sInstance; private LocationManager locationManager; @MainThread public static LocationLiveData get(Context context) { if (sInstance == null) { sInstance = new LocationLiveData(context.getApplicationContext()); } return sInstance; } private SimpleLocationListener listener = new SimpleLocationListener() { @Override public void onLocationChanged(Location location) { setValue(location); } }; private LocationLiveData(Context context) { locationManager = (LocationManager) context.getSystemService( Context.LOCATION_SERVICE); } @Override protected void onActive() { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener); } @Override protected void onInactive() { locationManager.removeUpdates(listener); }}
- onActive()
意味着LiveData已经有了处于活动状态的观察者 - onInactive()
意味着LiveData已经没有观察者或者没有观察者处于活动状态 - setValue()
更新LiveData实例并通知观察者发生了改变
public class MyFragment extends LifecycleFragment { public void onActivityCreated (Bundle savedInstanceState) { Util.checkUserStatus(result -> { if (result) { LocationLiveData.get(getActivity()).observe(this, location -> { // update UI }); } }); }}
Transformations of LiveData
- Transformations.map()
LiveData<User> userLiveData = ...;LiveData<String> userName = Transformations.map(userLiveData, user -> { user.name + " " + user.lastName});
- Transformations.switchMap()
private LiveData<User> getUser(String id) { ...;}LiveData<String> userId = ...;LiveData<User> user = Transformations.switchMap(userId, id -> getUser(id) );
只要有active状态的观察者,Transformations可以让LiveData转换自动进行,这种延迟计算的性质允许隐式地传递与生命周期相关的行为,而不需要添加显式的调用或依赖。
- Android 架构组件简单小结
- android四大组件小结
- android 组件 - Service小结
- [译]Android架构组件
- Android架构组件
- Android ViewPager的架构小结
- Android官方架构组件指南
- Android项目组件化架构
- android架构组件之Room
- Android架构组件之ViewModel
- Android架构组件之LiveData
- Android官方架构组件-ViewModel
- [译文]Android架构组件-App架构指南
- Android:四大组件之一service小结
- android四大组件之ContentProvider小结
- Android简单组件之_ImageButton_CheckBox
- Android四大组件简单介绍
- android组件GridView简单使用
- linux设备驱动的并发与竞争
- Tcp_Wrapper_简单的基于主机的访问控制工具
- mui开发APP教程之mui.ajax请求后出现“加载中”
- 仿滴滴打车开具发票页,ListView 粘性 Header
- {loop $tags $i $t}参数
- Android 架构组件简单小结
- Android逆向系列之动态调试3–Eclipse调试apk
- 技术文章 | 项目实战:如何构建知识图谱
- Eclipse 快捷键
- JavaSE系统学习1.1-Java虚拟机-JVM体系结构
- input输入框字体变色问题
- linux chmod 755 ,750,777
- zookeeper 在windows下启动zkServer.cmd闪退!
- Java日志,需要知道的几件事(commons-logging,log4j,slf4j,logback)