www.e4938.cn-老师你下面太紧了拔不出来,99re8这里有精品热视频免费,国产第一视频一区二区三区,青青草国产成人久久

<button id="60qo0"></button>

<strike id="60qo0"></strike>
<del id="60qo0"></del>
<fieldset id="60qo0"><menu id="60qo0"></menu></fieldset>
  • Android 項目最新架構(gòu)

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

    0.前言

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

    1、生命周期

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

    如上圖。雖然Google給出了Activity非常詳盡的生命周期結(jié)構(gòu),因此我們對根據(jù)生命周期做出相應(yīng)的合理的安排,比如添加和移除實時GPS位置監(jiān)聽:

    可是隨著業(yè)務(wù)的逐漸復(fù)雜,我們可能在添加監(jiān)聽之間需要向服務(wù)器驗證某些用戶信息,等返回信息正確才去監(jiān)聽定位。那么在網(wǎng)絡(luò)異步回調(diào)的時候,我們就很難知道當(dāng)前的activity的生命周期狀態(tài)。

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

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

    2、Google大禮包

    這次Google推出了一套新的項目架構(gòu)組件和架構(gòu)思路,從UI到Data,幫助我們更加精準(zhǔn)的開發(fā)自己的APP。

    2.1 核心:Lifecycle Components

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

    可查詢的狀態(tài)如下:

    具體的使用方式有兩種:

    • 繼承LifecycleActivity/LifecycleFragment即可
    • 自己實現(xiàn)LifecycleRegistryOwner接口

    java

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

    public classMainActivity extends LifecycleActivity {

    }

    那我們?nèi)绾问褂媚兀?/span>

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

    public classMyTest implements LifecycleObserver {

    private Lifecycle lifecycle;

    // Lifecycle包含了當(dāng)前組件的生命周期

    public MyTest(Lifecycle lifecycle){

    lifecycle.addObserver( this);

    this.lifecycle=lifecycle;

    }

    // 當(dāng)onResume發(fā)生的時候,該方法被調(diào)用

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)

    public voidresume(){

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

    }

    public voiddoTest( Strings){

    // 隨時可以查詢當(dāng)前的UI狀態(tài)

    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);

    //將當(dāng)前Activity的生命周期傳遞到MyTest中即可

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

    }

    }

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

    3、ViewModel和LiveData

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

    他倆的關(guān)系,就是,ViewModel負責(zé)管理著不同的LiveData,并把它提供給UI。

    3.1 LiveData

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

    onActive() // 當(dāng)前LiveData有超過一個的活躍的觀察者時,被調(diào)用

    onInactive() // 當(dāng)前沒有任何活躍的觀察時,著被調(diào)用

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

    // 觀察數(shù)據(jù)變化,并感知當(dāng)前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來判斷

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

    */

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

    @Override

    publicvoidonChanged(@Nullable Location location){

    // update

    //當(dāng)LiveData中通過setValue()修改了數(shù)據(jù)時,

    //這里將會受到修改后的數(shù)據(jù)

    }

    });

    }

    }

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

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

    現(xiàn)在回頭看LiveData,我們發(fā)現(xiàn)它至少有以下幾個優(yōu)點:

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

    一顆賽艇!

    3.2 ViewModel

    ViewModel則相對簡單些,因為他的作用是暫存UI相關(guān)的數(shù)據(jù),保證即使Activity配置更改,重新創(chuàng)建時,數(shù)據(jù)依然能夠被保存好。

    基本用法如下:

    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的最基本的用法,它負責(zé)從各個地方獲取數(shù)據(jù),然后把數(shù)據(jù)裝到LiveData中,提供給UI;當(dāng)然ViewModel也可以在不同的Fragment中共享,在這里就不多講了。

    由于ViewModel的本身和activity/fragment的生命周期綁定,當(dāng)與之綁定的最后一個UI 銷毀時,ViewModel才會clean自身的數(shù)據(jù)。

    如圖所示

    4、數(shù)據(jù)持久化:Room

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

    5、總結(jié)

    我們現(xiàn)在回頭看整個架構(gòu)

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

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

    6、勘誤

    暫無

    附錄

    大云網(wǎng)官方微信售電那點事兒

    責(zé)任編輯:售電衡衡

    免責(zé)聲明:本文僅代表作者個人觀點,與本站無關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實,對本文以及其中全部或者部分內(nèi)容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,并請自行核實相關(guān)內(nèi)容。
    我要收藏
    個贊
    ?
    国产又粗又猛又黄又爽无遮挡| 55夜色66夜色国产精品视频| 山东妇女p大毛多水多| 久久人人爽人人爽人人爽av| 亚洲一码二码三码精华液| 国产午夜无码专区喷水| 青柠影院免费观看电视剧高清下载| 免费一级毛片私人影院a行| 三级电影免费电影| 麻花传剧mv在线看高清|