Android 中不同的 activity 中實(shí)現(xiàn)共用一個(gè) ViewModel

Android 中不同的 activity 中實(shí)現(xiàn)共用一個(gè) ViewModel

在實(shí)際開發(fā)過程中,一個(gè)activity_A會(huì)根據(jù)另一個(gè)activity_B的改變而做出相應(yīng)的變化,聯(lián)想到利用viewmodel+livedata天生具有監(jiān)聽功能實(shí)現(xiàn),在viewmodel中存放一個(gè)livedata變量,在需要改變的activity中添加對(duì)livedata的監(jiān)聽,實(shí)現(xiàn)上述想法。
在 activity_B 中創(chuàng)建一個(gè)靜態(tài)變量來存放 activity_B 的 viewmodelStoreOwner對(duì)象

companion object{
        var mActivity_B : ViewModelStoreOwner? = null
}

在其onCreate回調(diào)中給這個(gè)靜態(tài)變量賦值

override fun onCreate() {
        mActivity_B = this   //此處 activity_B 實(shí)現(xiàn)了ViewModelStoreOwner接口,直接賦值this就行
}

特別重要一點(diǎn),由于此處的靜態(tài)變量持有“this”這個(gè)activity_B對(duì)象,會(huì)導(dǎo)致activity無法被回收,造成內(nèi)存泄漏,在activity 的 onDestroy() 的回調(diào)中將靜態(tài)變量釋放

override fun onDestroy() {
        super.onDestroy()
        mActivity_B = null
}

在 activity_A 中獲取到同一個(gè)ViewModel,然后利用監(jiān)聽,獲取viewmodel實(shí)現(xiàn):

private val shareViewModel : ShareViewModel by lazy {
  ViewModelProvider(Activity_B.mActivity_B?:this).get(ShareViewModel::class.java)
}

此后再在 activity_A 中創(chuàng)建livedata的監(jiān)聽,然后編寫監(jiān)聽觸發(fā)邏輯。

在此場(chǎng)景實(shí)現(xiàn),我還有個(gè)想法(待驗(yàn)證):由于 activity 的運(yùn)行中,loop是一直在循環(huán)的,嘗試在activity_B 中獲取到 activity_A 中的 looper 對(duì)應(yīng)的 MessageQueen 對(duì)象,然后在activityB中向獲取到的消息隊(duì)列中發(fā)送消息,由 looper 實(shí)現(xiàn)監(jiān)聽回調(diào)。(后期更新是否可行)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容