Jetpack實現安卓中數據共享的方式

語言: CN / TW / HK

highlight: a11y-dark theme: channing-cyan


持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第7天,點擊查看活動詳情

實際開發中我們總是會碰到這種需求。就是需要將數據在同一個acitivtiy中的AFramgent和BFragment之間傳遞。比如:AFragment中有某個產品選中了,當切換到BFragment時這種產品需要作出樣式上的改變。這時候安卓的做法一般有兩種: - 當AFragment某個產品被選中後把該產品唯一標識記錄下來,當切換到B時,取出標識然後進行相應邏輯處理。取標識可以通過公共的acitivity也可以通過EventBus等數據傳遞方式; - 通過宿主acitivity增加回調接口的方式傳遞。

jetpack可以利用ViewModel實現這種效果,接下里就介紹ViewModel實現這種數據傳遞的方式。

ViewModel是什麼?

ViewModel類是根據生命週期的方式存儲和管理界面相關的數據。ViewModel類可在發生屏幕旋轉的時候讓數據繼續保存而後恢復。

# ViewModel生命週期:

image.png   如上圖所示,ViewModel的生命週期遠遠長於activity頁面的一整個生命週期。我們知道屏幕旋轉的生命週期是這樣的onPause-->onStop-->onSaveInstanceState-->onDestroy-->onCreate--> onStart-->onRestoreInstanceState-->onResume。因為ViewModel比activity的生命週期要長所以就可以通過把需要保存的數據在ViewModel中保存,當需要恢復的時候從中取出即可。這時候其實又有一個新的問題,因為ViewModel的生命週期比activity長如果通過activity上下文對象構建ViewModel,會導致內存泄漏。那麼接下來我們聊聊ViewModel內存泄漏的事。

Viewmodel實現數據共享:

``` class ShareDataViewModel: ViewModel (){

private var currentId : String =0

fun getcurrentId (): String {(
return currentId
}

fun productChanged ( currentId : String ){
    this . currentId = currentId
}

} ```   ShareDataViewModel繼承自Viewmodel。AFragment當標籤變化時通過ShareDataViewModel的實例調用productChanged方法傳入產品的id,當BFragment要根據id更改UI時通過ShareDataViewModel的實例調用getcurrentId方法獲取到id後更新UI。

通過這樣的方式,ViewModel就實現了頁面間的數據共享問題。

感謝您的閲讀,專注才能提高學習效率,peace!