ViewModel 到底是啥

入門文章. 本文純屬個人見解, 請謹慎閱讀.

本文回答這個問題:
Jetpack 中的 ViewModel 到底是啥, Google 希望開發(fā)者怎么用?

ViewModel

  • Google 為什么推出 ViewModel 這個東西?
    從開始做 Android 開發(fā), 就有一個問題覺得不可思議: 我只不過是把屏幕旋轉了一下, 為什么我存到 Activity / Fragment 中的變量(對象\數據)就沒了呢? 難道 Android 能幫我把 view 重建, 就不能幫我把這些數據保存下來?

    后來我們知道, 由于 Android 發(fā)生了 config change, view 的重建意思就是 Activity Fragment 等組件, 在銷毀之后, Android 幫助我們重新創(chuàng)建了. 這是跟生命周期相關的. 然后 Android 就把數據保存的工作甩給了開發(fā)者, 告訴開發(fā)者們 你們可以用 onSaveInstanceState(outBundle: Bundle) 這個方法在組件被銷毀之前保存下來, 最后當這些組件重新創(chuàng)建的時候, 在 onCreate(savedInstanceState: Bundle?) 中讀取并設置控件的值就行了.

    乍一看, 這沒什么毛病, 人家要銷毀你的組件了, 給你提供一組保存和重置數據的接口方法, 并且?guī)湍阒匦聞?chuàng)建了組件, 仁至義盡了對吧?
    實際上, 作為菜鳥級開發(fā)者, 這對我來說實在有點太難了. 我還要記住這些方法名, 以及方法的參數有時候有值 有時候又沒有值(onCreate 方法的傳入參數, 在正常創(chuàng)建的時候為空, 在銷毀重建恢復用戶數據的時候可能不為空). 有這時間我多想想怎么把 APP 的業(yè)務搞的更健壯不好嗎?

    這實際上就是 Google 在了解到開發(fā)者的痛楚之后, 為廣大的 Android 開發(fā)者提供的福利. (而我還是感覺 Google 可以做的更好, 這種生命周期對開發(fā)者來說最好是透明的, 開發(fā)者不用去關心什么時候 view重建了 我要重新賦值了 等等這些問題, 開發(fā)者只要做好業(yè)務實現, 其他都交給 framework, 這才是我心目中理想的框架實現)

    那么為我們保存Activity 和 Fragment 狀態(tài)的就是: ViewModel.

    ViewModel 不同于 Activity 中的實例變量. Activity 中的實例變量在Activity發(fā)生 config change 的時候被銷毀了. 而 ViewModel 對象有一個獨立的生命周期. 他不會由于 Activity 的config change而銷毀. 因此 ViewModel 這個對象是可以獨立于 Activity 的生命周期而幸存的.

    簡單說就是: ViewModel 幫助開發(fā)者省去了對 onSaveInstanceState(outBundle: Bundle)onCreate(savedInstanceState: Bundle) 這兩個方法的顧慮.

  • ViewModel 好用嗎?

    • 上面說了 ViewModel 的出現, 讓開發(fā)者省去了對狀態(tài)數據銷毀和重建的顧慮.
    • 那么他好用嗎? 要是雖然不用考慮那兩個方法了, 但是需要考慮更多的細節(jié), 豈不是得不償失?
    • 對! 是的! 好用! 至少不會比之前難用!
  • ViewModel 怎么用?

    • 很簡單, 只要記住兩個步驟就行:
    1. 原來在 Activity 或 Fragment 中創(chuàng)建實例變量的地方, 改成對 ViewModel 的引用
    2. 創(chuàng)建一個 ViewModel 的子類, 把原來寫在 Activity 中的那些實例變量放到這個 viewModel 里面去

徒手寫代碼

  • 創(chuàng)建一個 ViewModel
class MainActivityViewModel : ViewModel() {
    var name: String? = null
    var age: Int? = null
}
  • 在 Activity 中引用
class MainActivity: AppCompatActivity() {
    private lateinit var mainViewModel:  MainActivityViewModel 

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
       mainViewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)
       // mainViewModel.name = "chinalwb"
       // 訪問mainViewModel.age, 操作..
       // 把 mainViewModel 的值設置到控件上
    }

}
  • 很簡單對吧?!
  • 是的.. 額! 你沒說怎么恢復已經保存的數據啊
  • 嗯, 你說的非常好! 我們知道在 Activity 發(fā)生 config change 而銷毀重建的時候, onCreateView 是必定要執(zhí)行到的. 所以我們在這個方法中對 viewModel 進行初始化和數據的訪問和設定, 就完成了數據的恢復
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瓜客,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異堂油,居然都是意外死亡,警方通過查閱死者的電腦和手機碧绞,發(fā)現死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門府框,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人头遭,你說我怎么就攤上這事寓免。” “怎么了计维?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵袜香,是天一觀的道長。 經常有香客問我鲫惶,道長蜈首,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任欠母,我火速辦了婚禮欢策,結果婚禮上,老公的妹妹穿的比我還像新娘赏淌。我一直安慰自己踩寇,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布六水。 她就那樣靜靜地躺著俺孙,像睡著了一般辣卒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睛榄,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天荣茫,我揣著相機與錄音,去河邊找鬼场靴。 笑死啡莉,一個胖子當著我的面吹牛,可吹牛的內容都是我干的旨剥。 我是一名探鬼主播咧欣,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轨帜!你這毒婦竟也來了该押?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤阵谚,失蹤者是張志新(化名)和其女友劉穎蚕礼,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體梢什,經...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡奠蹬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了嗡午。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囤躁。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荔睹,靈堂內的尸體忽然破棺而出狸演,到底是詐尸還是另有隱情,我是刑警寧澤僻他,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布宵距,位于F島的核電站,受9級特大地震影響吨拗,放射性物質發(fā)生泄漏满哪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一劝篷、第九天 我趴在偏房一處隱蔽的房頂上張望哨鸭。 院中可真熱鬧,春花似錦娇妓、人聲如沸像鸡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽只估。三九已至华望,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仅乓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工蓬戚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留夸楣,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓子漩,卻偏偏與公主長得像豫喧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子幢泼,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355