LiveData迁匠,ViewModel政鼠,Lifecycle原理解析以及使用

一. 使用

Lifecycle如果用Activity/Fragment的話扒吁,可以不必理會犁钟,直接用support包版本26.1.0以上的AppCompactActivity/FragmentActivity(繼承自SupportActivity)或者Fragment即可

一般由Activity在onCreate()的時候通過ViewProviders.of(this).get(xxxViewModel.class)創(chuàng)建稳摄,例如

public class MyActivity extends FragmentActivity {
 
    MyActivity mViewModel;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
 
        mViewModel = ViewModelProviders.of(this).get(MyActivityViewModel.class);
    }
}

Activity直接調(diào)用ViewModel去做一些業(yè)務(wù)邏輯稚字,并通過監(jiān)聽ViewModel中的LiveData變化來更新界面

public class MyActivity extends FragmentActivity {
 
    MyActivityViewModel mViewModel;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
 
        mViewModel = ViewModelProviders.of(this).get(MyActivityViewModel.class);
 
        mViewModel.getProductShowLiveData().observe(this, product -> {
            if (product.isConnected()) {
                // 更新UI
                mTextView.setText(getString(product.getNameId());
            }
        });
        // 一些業(yè)務(wù)邏輯
        mViewModel.doSomeBusiness();
    }
}
public class MyActivityViewModel extends BaseRxViewModel<MyActivityRepository> {
   
    private MutableLiveData<ProductTypeShowData> mProductShowLiveData = new MutableLiveData<>();
 
    public MyActivityViewModel(@NonNull Application application) {
        super(application);
    }
 
    private void doSomeBusiness() {
        // 一些業(yè)務(wù)邏輯
        ...
        // 通知UI更新,并將UI需要的數(shù)據(jù)源setValue通知出去
        mProductShowLiveData.setValue(XXXX);
    }
}

二. 原理

ViewModel

ViewModel的功能在于能自動處理轉(zhuǎn)屏厦酬,切換輸入法等配置變更引起的Activity銷毀胆描,生命周期重走問題,使得重新生成的Activity拿到的依然是之前的ViewModel仗阅,也即該ViewModel的生命周期是從Activity start到finish昌讲,中間不管因?yàn)榕渲米兏麬ctivity銷毀重啟多少次,ViewModel都是不會重啟的(所以不能在ViewModel里持有Activity的Context)

ViewModel生命周期

具體源碼分析推薦可以閱讀這篇文章减噪,基本原理是在Activity上add一個setRetainInstance(true)的HolderFragment短绸,由其保存對應(yīng)Activity的ViewModelStore车吹,在Activity重走生命周期后,在onCreate()中再次通過ViewModelProviders.of(this)找到對應(yīng)的HolderFragment的ViewModelStore醋闭,并通過get(xxxViewModel.class)以class為key窄驹,找到存在ViewModelStore中的ViewModel。

(故在Fragment之間可以通過ViewModelProviders.of(getActivity()).get(xxxViewModel.class)來獲取到相同的ViewModel证逻,從而實(shí)現(xiàn)Fragment之間的ViewModel共享)


ViewModelProviders.of(this).get(xxxViewModel.class)實(shí)際的內(nèi)部結(jié)構(gòu)

LiveData

LiveData的功能在于乐埠,在于setValue時(非UI線程使用postValue),會根據(jù)當(dāng)前界面的生命周期(通過在界面上add一個無界面的ReportFragment囚企,接收其生命周期回調(diào)來實(shí)現(xiàn)丈咐,很經(jīng)典的做法,Glide比起其他的圖片加載庫有感知生命周期的功能也是這么做的)龙宏,選擇要不要回調(diào)到UI界面更新(在對應(yīng)的Activity調(diào)用onStart()之前棵逊,onStop()之后,都是不會更新界面的)烦衣,那么如果遇到這些情況歹河,LiveData會選擇在每一次對應(yīng)界面的生命周期變化時,以及調(diào)用LiveData.observe()建立監(jiān)聽關(guān)系時再去嘗試回調(diào)UI更新


LiveData分發(fā)消息過程以及觸發(fā)時機(jī)
Lifecycle.State

關(guān)于這塊的源碼花吟,代碼量其實(shí)也不多秸歧,LiveData相關(guān)的還是比較簡單的,LifecycleRegistry分發(fā)生命周期稍微有一點(diǎn)點(diǎn)繞衅澈,但也還好键菱,在使用過的基礎(chǔ)上一天基本就能通讀代碼

源碼解析鏈接里這位博主寫的很好:

LiveData:

https://jekton.github.io/2018/07/14/android-arch-LiveData/

Lifecycle

https://jekton.github.io/2018/07/06/android-arch-lifecycle/

三. 總結(jié)

LiveData,ViewModel以及Lifecycle相關(guān)的api都已經(jīng)被收錄進(jìn)了google推出的幫助開發(fā)者更快更專注地開發(fā)app的jetpack火箭背包里今布,現(xiàn)在最新的代碼都在androidx庫上更新

https://developer.android.com/topic/libraries/architecture/adding-components#lifecycle

AndroidX庫引入

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末经备,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子部默,更是在濱河造成了極大的恐慌侵蒙,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傅蹂,死亡現(xiàn)場離奇詭異纷闺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)份蝴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門犁功,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人婚夫,你說我怎么就攤上這事浸卦。” “怎么了案糙?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵限嫌,是天一觀的道長靴庆。 經(jīng)常有香客問我,道長萤皂,這世上最難降的妖魔是什么撒穷? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮裆熙,結(jié)果婚禮上端礼,老公的妹妹穿的比我還像新娘。我一直安慰自己入录,他們只是感情好蛤奥,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著僚稿,像睡著了一般凡桥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚀同,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天缅刽,我揣著相機(jī)與錄音,去河邊找鬼蠢络。 笑死衰猛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刹孔。 我是一名探鬼主播啡省,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼髓霞!你這毒婦竟也來了卦睹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤方库,失蹤者是張志新(化名)和其女友劉穎结序,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纵潦,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笼痹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酪穿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡晴裹,死狀恐怖被济,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涧团,我是刑警寧澤只磷,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布经磅,位于F島的核電站,受9級特大地震影響钮追,放射性物質(zhì)發(fā)生泄漏预厌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一元媚、第九天 我趴在偏房一處隱蔽的房頂上張望轧叽。 院中可真熱鬧,春花似錦刊棕、人聲如沸炭晒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽网严。三九已至,卻和暖如春嗤无,著一層夾襖步出監(jiān)牢的瞬間震束,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工当犯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垢村,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓灶壶,卻偏偏與公主長得像肝断,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子驰凛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容