在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...