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!