www涩-www黄网站-www黄色-www黄色com-国产免费拍拍视频在线观看网站-国产免费怕怕免费视频观看

Android 項目最新架構

2018-03-27 16:54:58 sohu 程序員大咖  點擊量: 評論 (0)
0 前言為了幫助開發著打造一款優秀的APP,Google可謂費盡心力,推出了各種諸如MVP,MVVM等等項目架構的思路,幫助開發者更加高效的開發,盡

0.前言

為了幫助開發著打造一款優秀的APP,Google可謂費盡心力,推出了各種諸如MVP,MVVM等等項目架構的思路,幫助開發者更加高效的開發,盡管這樣,Google還是接著推出了一個新的項目架構,以便給予開發者更多的選擇,至于這種架構思路和MVP等框架的優劣,各位看完文章或許自有定論。

1、生命周期

在移動操作系統上開發軟件其實是十分復雜的一件事情,因為我們隨時需要面對系統和用戶的各種不可預料的操作,很多時候,事情并不向著我們預設的方向方向進展。因此系統向我們提供了核心組件的生命周期這種東西,告知我們的APP正處在什么樣的狀況中,以便于我們做出相應的處理。

如上圖。雖然Google給出了Activity非常詳盡的生命周期結構,因此我們對根據生命周期做出相應的合理的安排,比如添加和移除實時GPS位置監聽:

可是隨著業務的逐漸復雜,我們可能在添加監聽之間需要向服務器驗證某些用戶信息,等返回信息正確才去監聽定位。那么在網絡異步回調的時候,我們就很難知道當前的activity的生命周期狀態。

如果發生上圖的情況,那么我們的占用的相關資源就可能永遠無法移除了。這還只是冰山一角,大家盡可以想想,當我們的異步調用面對無法預知的用戶操作和系統處理的時候,什么問題都可能發生。

總而言之,由于我們對于UI實時的狀態做不到了如指掌,以至于對數據和邏輯的處理就無法盡善盡美。這是類似隱患得不到很好的解決根本原因。

2、Google大禮包

這次Google推出了一套新的項目架構組件和架構思路,從UI到Data,幫助我們更加精準的開發自己的APP。

2.1 核心:Lifecycle Components

這套架構最核心的就是生命周期組件,:Lifecycle Components用于管理UI控制器(Activity/Freagment)的生命周期,方便查詢當前組件生命周期的狀態。

可查詢的狀態如下:

具體的使用方式有兩種:

  • 繼承LifecycleActivity/LifecycleFragment即可
  • 自己實現LifecycleRegistryOwner接口

java

// 通過繼承,就已經將自己的生命周期的交給了Lifecycle Components管理了。

public classMainActivity extends LifecycleActivity {

}

那我們如何使用呢?

// 通過繼承LifecycleObserver,保證我們可以通過注解或者接口查詢UI的生命周期

public classMyTest implements LifecycleObserver {

private Lifecycle lifecycle;

// Lifecycle包含了當前組件的生命周期

public MyTest(Lifecycle lifecycle){

lifecycle.addObserver( this);

this.lifecycle=lifecycle;

}

// 當onResume發生的時候,該方法被調用

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)

public voidresume(){

Log.i( "TAG", "it called when resume ");

}

public voiddoTest( Strings){

// 隨時可以查詢當前的UI狀態

if(lifecycle.getCurrentState().equals(Lifecycle.State.RESUMED)){

Log.i( "TAG", "resume");

} else{

Log.i( "TAG", "is not resume !! ");

}

}

}

public classMainActivity extends LifecycleActivity {

@Override

protected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//將當前Activity的生命周期傳遞到MyTest中即可

MyTest myTest= newMyTest( this.getLifecycle());

}

}

看到這里,你一定心頭一喜,如果有這個組件,那么我們就完全有能力將Activity作為一個UI的控制器,僅僅用來顯示UI和相應用戶操作,把Activity的大小縮小至最小。不用著急,大禮包遠不止這些。

3、ViewModel和LiveData

  • ViewModel 是一個UI相關數據的暫存器,當所有相關的UI都finish掉的時候,它才會清除自己的數據。
  • LiveData則是一個持有具體數據并且可被觀察,能感知生命周期的組件(它就像RxJava中一個能遵循組件生命周期的Observable)

他倆的關系,就是,ViewModel負責管理著不同的LiveData,并把它提供給UI。

3.1 LiveData

我們可以先來說說LiveData。由于它已經能夠感知生命周期,也就意味著我們并不需要在去查詢當前UI的生命周期,由于可被觀察,也就意味著當它持有的數據發生改變,觀察者可以立即受到信息。livedata最重要的方法是一下幾個:

onActive() // 當前LiveData有超過一個的活躍的觀察者時,被調用

onInactive() // 當前沒有任何活躍的觀察時,著被調用

setValue() // 勇于改變當前數據,這樣觀察者可以受到改變后的數據。

// 觀察數據變化,并感知當前UI的生命周期

observe(LifecycleOwner owner, Observer<T> observer)

這里有一個活躍的觀察者的概念,我們不妨把它放在后面來看。LiveData的用法如下:

publicclassLocationLiveDataextendsLiveData<Location> {

privateLocationManager locationManager;

privateSimpleLocationListener listener = newSimpleLocationListener() {

@Override

publicvoidonLocationChanged(Location location){

setValue(location);

}

};

publicLocationLiveData(Context context){

locationManager = (LocationManager) context.getSystemService(

Context.LOCATION_SERVICE);

}

@Override

protectedvoidonActive(){

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);

}

@Override

protectedvoidonInactive(){

locationManager.removeUpdates(listener);

}

}

publicclassMainActivityextendsLifecycleActivity{

@Override

protectedvoidonCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

LiveData<Location> myLocationListener = newLocationLiveData();

/*

* observe(LifecycleOwner owner, Observer<T> observer)

* 這個方法就是向LiveData中添加觀察者,

* LiveData則可以通過LifecycleOwner來判斷

* 當前傳入的觀察者是否是活躍的(也就是UI是否可見了)

*/

myLocationListener.observe( this, newObserver<Location>() {

@Override

publicvoidonChanged(@Nullable Location location){

// update

//當LiveData中通過setValue()修改了數據時,

//這里將會受到修改后的數據

}

});

}

}

好了,LiveData基本的用法講完了,由于有了LiveData,我們的data更加“智能”了。當UI不可見的時候,改變的數據將不會被更新到UI上。

而且如果數據在不同的UI界面都會被用到的時候,我們還可以一個單例的LiveData,為不同的UI提供統一的數據。這些操作就不去細講了。

現在回頭看LiveData,我們發現它至少有以下幾個優點:

  • 可以避免內存泄露:由于 Observer 和 Lifecycle 綁定,當 Lifecycle 被銷毀后,Observer 自動被清理。
  • 避免在 Activity 被銷毀后更新數據導致的崩潰情況
  • 數據可共享
  • 數據更新更智能:當數據在UI不可見的時候更新了,在恢復可見的時候,最新的數據會及時更新到UI上。
  • 不需要在Activity中額外處理生命周期事件

一顆賽艇!

3.2 ViewModel

ViewModel則相對簡單些,因為他的作用是暫存UI相關的數據,保證即使Activity配置更改,重新創建時,數據依然能夠被保存好。

基本用法如下:

publicclassMyViewModelextendsViewModel{

// MyViewModel用于管理不同的LiveData

privateMutableLiveData<List<User>> users;

publicLiveData<List<User>> getUsers() {

if(users == null) {

users = newMutableLiveData<List<Users>>();

loadUsers();

}

returnusers;

}

privatevoidloadUsers(){

// do async operation to fetch users

}

}

publicclassMyActivityextendsAppCompatActivity{

publicvoidonCreate(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自身的數據。

如圖所示

4、數據持久化:Room

Room是Google提供的SQLite的ORM的解決方案,其實本質上和其他的ORM框架沒什么特別大的差別,沒有太多新意,因此只給出大體的架構圖,有興趣的同學可以自行去學習

5、總結

我們現在回頭看整個架構

其實最有有趣的就是UI-ViewModel這個部分,這套架構至少可以幫助我們做到一下幾點:

  • UI與Data真正分離
  • 異步調用和邏輯控制可以更加精細(因為對生命周期感知更多)
  • 實現Model驅動UI

6、勘誤

暫無

附錄

大云網官方微信售電那點事兒

責任編輯:售電衡衡

免責聲明:本文僅代表作者個人觀點,與本站無關。其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,并請自行核實相關內容。
我要收藏
個贊
?
主站蜘蛛池模板: 成人免费大片a毛片 | 国产人做人爱免费视频 | 日本三级网站在线线观看 | 亚洲国产欧美目韩成人综合 | 国产一区二区三区美女在线观看 | 国产视频自拍一区 | 欧美一级人与动毛片免费播放 | 毛片在线播放网址 | 成人高清视频免费观看 | mm在线视频免费看 | 五月色一区二区亚洲小说 | 亚洲天堂免费视频 | 亚州精品视频 | 日本精品视频一区二区三区 | 亚洲一区免费视频 | 巨乳毛片 | 成年人视频在线免费播放 | 最近免费手机中文字幕3 | 久久久久亚洲视频 | 精品手机在线 | 欧美野外性k8播放性迷宫 | 在线第一页 | 香港国产特级一级毛片 | 久久精品视频免费在线观看 | 亚洲黄网址 | 日本在线资源 | 免费特黄级夫费生活片 | 亚洲欧美色视频 | 日韩欧美毛片免费观看视频 | 国产男女交性视频播放免费bd | 亚洲 欧美 日韩在线 | 中文一区在线观看 | 久久综久久美利坚合众国 | 国产一久久香蕉国产线看观看 | 成人国产片免费 | 久草色视频 | 成人网在线免费观看 | 国产精品久久精品视 | 亚洲午夜精品久久久久久抢 | 精品自拍视频在线观看 | 亚洲免费视频一区二区三区 |