爲了幫助開發者打造一款優秀的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…