攜帶狀態的LiveData

2021-09-24 06:27:16 字數 1583 閱讀 7808

在android mvvm架構中,livedata作為通知ui更新的橋梁,地位極其重要,可以說是mvvm的核心元件。

class

uservm : viewmodel

() }

}複製**

這樣的**會大量出現在我們的vm層中。

然而非同步操作不是立即的,而且有進度,有狀態的。我們的ui很可能需要知道當前的非同步資料操作是否正在進行(可以顯示進度條),是否已經完成,或者是否失敗。

一般我們可以能這樣做:

uservm.userdata.observe(this, observerelse

})showprogress() //登入之前顯示進度條

uservm.login()

複製**

雖然我們也能在**的某些地方去插入狀態展示,但這樣的寫法太過零碎,不易維護和管理。假設ui**有幾百行,你就會很難找到某個請求的進度條在**寫著。

如果每個livedata能攜帶自己的狀態,我們就可以面向livedata來進行狀態更新,而且能在乙個地方集中管理狀態,這樣就優雅的很。

於是我們可以對livedata進行擴充套件,增加乙個state字段,代表當前非同步操作的狀態。由於狀態應當是可監聽的,所以state也是乙個livedata。**如下:

/**

* description: 攜帶狀態的livedata

* create by lxj, at 2019/3/6

*/class

statelivedata

: mutablelivedata

() val state = mutablelivedata()

init

funpostvalueandsuccess

(value: t)

funclearstate()

funpostloading()

funpostsuccess()

funposterror()

funchangestate

(s: state) }

複製**

我們使用statelivedata改寫vm層的**:

class

uservm : viewmodel

() else}}

}複製**

而此時ui層對狀態的監聽變成了這樣:

//統一管理livedata的狀態

uservm.userdata.state.observe(this, observer

})uservm.userdata.observe(this, observer)

uservm.login()

複製**

上面的statelivedata被內建在我的androidktx類庫中:github.com/li-xiaojun/… ,如果你用kotlin開發android,這個庫將能夠大大提高你的開發速度。我是俊哥,致力於推進現代化的android開發,用最佳的實踐,最優雅的**教你最快速的開發高質量android應用。

Python 攜帶狀態的閉包

在 python 中,函式也是乙個物件。因此,我們在定義函式時,可以再巢狀定義乙個函式,並將該巢狀函式返回,比如 from math import pow def make pow n def inner func x 巢狀定義了 inner func return pow x,n 注意這裡引用了外...

cookie帶狀態返回

需求場景 點選瀏覽器返回,回到主頁時,展現指定的tab頁。如下圖 圖中兩個 點我 都會去到詳情頁面。但是點返回時,都會回到可參與的tab狀態。那麼對於使用者的體驗是不太友好的。解決辦法 由於每次點返回,其實主頁都會重新整理一遍。那麼可以從這裡下手。思路方法1 記錄最後一次tab的狀態,並在跳轉時,呼...

帶狀矩陣的儲存(c )

2 1 0 03 1 3 00 5 2 70 0 90這個程式對於三對角矩陣都是有效的,為了精簡 可以考慮用鍊錶的方式動態儲存矩陣資料,由於程式已經完成,本次未採用鍊錶,看著 比較冗長 include include include include include using namespace s...