为了帮助开发者打造一款优秀的APP,Google可谓费尽心力,推出了各类诸如MVP,MVVM等等项目架构的思路,帮助开发者更加高效的开发,尽管这样,Google仍是接着推出了一个新的项目架构,以便给予开发者更多的选择,至于这种架构思路和MVP等框架的优劣,各位看完文章或许自有定论。html
在移动操做系统上开发软件实际上是十分复杂的一件事情,由于咱们随时须要面对系统和用户的各类不可预料的操做,不少时候,事情并不向着咱们预设的方向方向进展。所以系统向咱们提供了核心组件的生命周期这种东西,告知咱们的APP正处在什么样的情况中,以便于咱们作出相应的处理。java
如上图。虽然Google给出了Activity很是详尽的生命周期结构,所以咱们对根据生命周期作出相应的合理的安排,好比添加和移除实时GPS位置监听:android
但是随着业务的逐渐复杂,咱们可能在添加监听之间须要向服务器验证某些用户信息,等返回信息正确才去监听定位。那么在网络异步回调的时候,咱们就很难知道当前的activity的生命周期状态。bash
若是发生上图的状况,那么咱们的占用的相关资源就可能永远没法移除了。这还只是冰山一角,你们尽能够想一想,当咱们的异步调用面对没法预知的用户操做和系统处理的时候,什么问题均可能发生。服务器
总而言之,因为咱们对于UI实时的状态作不到了如指掌,以致于对数据和逻辑的处理就没法尽善尽美。这是相似隐患得不到很好的解决根本缘由。网络
此次Google推出了一套新的项目架构组件和架构思路,从UI到Data,帮助咱们更加精准的开发本身的APP。架构
这套架构最核心的就是生命周期组件,:Lifecycle Components用于管理UI控制器(Activity/Freagment)的生命周期,方便查询当前组件生命周期的状态。框架
可查询的状态以下:异步
具体的使用方式有两种:async
java
// 经过继承,就已经将本身的生命周期的交给了Lifecycle Components管理了。
public class MainActivity extends LifecycleActivity {
}
复制代码
那咱们如何使用呢?
// 经过继承LifecycleObserver,保证咱们能够经过注解或者接口查询UI的生命周期
public class MyTest implements LifecycleObserver {
private Lifecycle lifecycle;
// Lifecycle包含了当前组件的生命周期
public MyTest(Lifecycle lifecycle){
lifecycle.addObserver(this);
this.lifecycle=lifecycle;
}
// 当onResume发生的时候,该方法被调用
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void resume(){
Log.i("TAG","it called when resume ");
}
public void doTest(String s){
// 随时能够查询当前的UI状态
if(lifecycle.getCurrentState().equals(Lifecycle.State.RESUMED)){
Log.i("TAG","resume");
}else{
Log.i("TAG","is not resume !! ");
}
}
}
public class MainActivity extends LifecycleActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//将当前Activity的生命周期传递到MyTest中便可
MyTest myTest=new MyTest(this.getLifecycle());
}
}
复制代码
看到这里,你必定心头一喜,若是有这个组件,那么咱们就彻底有能力将Activity做为一个UI的控制器,仅仅用来显示UI和相应用户操做,把Activity的大小缩小至最小。不用着急,大礼包远不止这些。
他俩的关系,就是,ViewModel负责管理着不一样的LiveData,并把它提供给UI。
咱们能够先来讲说LiveData。因为它已经可以感知生命周期,也就意味着咱们并不须要在去查询当前UI的生命周期,因为可被观察,也就意味着当它持有的数据发生改变,观察者能够当即受到信息。livedata最重要的方法是一下几个:
onActive() // 当前LiveData有超过一个的活跃的观察者时,被调用
onInactive() // 当前没有任何活跃的观察时,着被调用
setValue() // 敢于改变当前数据,这样观察者能够受到改变后的数据。
// 观察数据变化,并感知当前UI的生命周期
observe(LifecycleOwner owner, Observer<T> observer)
复制代码
这里有一个活跃的观察者的概念,咱们不妨把它放在后面来看。LiveData的用法以下:
public class LocationLiveData extends LiveData<Location> {
private LocationManager locationManager;
private SimpleLocationListener listener = new SimpleLocationListener() {
@Override
public void onLocationChanged(Location location) {
setValue(location);
}
};
public 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);
}
}
public class MainActivity extends LifecycleActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LiveData<Location> myLocationListener = new LocationLiveData();
/*
* observe(LifecycleOwner owner, Observer<T> observer)
* 这个方法就是向LiveData中添加观察者,
* LiveData则能够经过LifecycleOwner来判断
* 当前传入的观察者是不是活跃的(也就是UI是否可见了)
*/
myLocationListener.observe(this, new Observer<Location>() {
@Override
public void onChanged(@Nullable Location location) {
// update
//当LiveData中经过setValue()修改了数据时,
//这里将会受到修改后的数据
}
});
}
}
复制代码
好了,LiveData基本的用法讲完了,因为有了LiveData,咱们的data更加“智能”了。当UI不可见的时候,改变的数据将不会被更新到UI上。
并且若是数据在不一样的UI界面都会被用到的时候,咱们还能够一个单例的LiveData,为不一样的UI提供统一的数据。这些操做就不去细讲了。
如今回头看LiveData,咱们发现它至少有如下几个优势:
一颗赛艇!
ViewModel则相对简单些,由于他的做用是暂存UI相关的数据,保证即便Activity配置更改,从新建立时,数据依然可以被保存好。
基本用法以下:
public class MyViewModel extends ViewModel {
// MyViewModel用于管理不一样的LiveData
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<Users>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// do async operation to fetch users
}
}
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
// 经过了ViewModelProviders来获取ViewModel
// 用户获取和Activity绑定的ViewModel
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
}
}
复制代码
这是ViewModel的最基本的用法,它负责从各个地方获取数据,而后把数据装到LiveData中,提供给UI;固然ViewModel也能够在不一样的Fragment中共享,在这里就很少讲了。
因为ViewModel的自己和activity/fragment的生命周期绑定,当与之绑定的UI控制器被销毁时,ViewModel才会clean自身的数据。
如图所示
Room是Google提供的SQLite的ORM的解决方案,其实本质上和其余的ORM框架没什么特别大的差异,没有太多新意,所以只给出大致的架构图,有兴趣的同窗能够自行去学习
咱们如今回头看整个架构
其实最有有趣的就是UI-ViewModel这个部分,这套架构至少能够帮助咱们作到一下几点:
暂无
android官网: developer.android.com/topic/libra…