前言
…MVP已經火爆的好幾年了,自己也寫了一些對於MVP的理解
Android常見的MVP模式與封裝,感興趣的可以去看看,哈哈,但是用了幾年發現這玩意還是有很大的缺陷,最不爽的就是,寫下來就是接口接口接口接口,雖然可以用契約類寫在一起,或者直接用模板去生成對應模塊的接口以及類,但是也顯得麻煩。還要自己去定製一個個模板類。還有就是如果P層持有的VIew沒有處理好。也會照成內存的泄露。所以對於這些原因,加上Google推薦使用Android Jetpack來構建項目,MVVM就值得大家去學習一下啦。!!
MVVM?
什麼是MVVM?一開始聽到這個玩意,也是一臉的迷茫,啥玩意? 去看了一下,就是這個Model-View-ViewModel。
M和V,跟MVP中的沒啥區別,要我說就是一個意思,對應的就是獲取數據的類和界面,activity/fragment等。重點就在於這個ViewModel,這纔是我們要正在要學習的東西。
ViewModel?
二話不說,官網的介紹就是最好的學習資料。看下官網對他的描述
總的來說就是爲activity或者fragment準備和管理業務邏輯。照我看來就跟MVP中的P差不多,不同之處在於他們怎樣把數據傳遞給View層而已。而P呢,是持有View的接口引用去回調傳遞數據,而ViewModel則是通過LiveData去傳遞數據。
還有一些特性,具有生命週期,就是在依附的Activity或者Fragment沒要銷燬之前數據是不會丟失,
或者屏幕翻轉等。
使用ViewModel時一定要注意,不能讓其引用Activity或View,否則可能導致內存泄漏
LiveData?
官網介紹
可觀察並且具有生命週期感知的一個玩意。什麼意思呢?那就看看例子
簡單的例子
需求:獲取服務器數據並activity打印
M: LoginRepository
class LoginRepository {
suspend fun login(userName: String, passWord: String): Response<User> {
return RetrofitClient.service.login(userName, passWord)
}
}
VM:LoginViewModel
class LoginViewModel : ViewModel() {
private val repository by lazy { LoginRepository() }
//用LiveData的子類包裹要檢測的值
val mLoginUser: MutableLiveData<User> = MutableLiveData()
fun login(userName: String, passWord: String) {
//使用withContext(Dispatchers.IO) 切換線程
val response = withContext(Dispatchers.IO) { repository.login(userName, passWord) }
//這裏直接調用 MutableLiveData setValue 方法把更新數據,如果是異步線程可以使用postValue
mLoginUser.value = response.data
}
}
v:LoginActivity
class LoginActivity:AppCompatActivity(){
private var mLoginViewModel: LoginViewModel ? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
mLoginViewModel = ViewModelProvider(this)[LoginViewModel ::class.java]
//實例化ViewModel,並且監聽數據的更新
//不需要在 onPause 或 onDestroy 方法中解除對 LiveData 的訂閱/觀察。此外,一旦觀察者重新恢復 Resumed 狀態,它將會重新收到 LiveData 的最新數據
mLoginViewModel?.mLoginUser.observe(this@LoginActivity, Observer {
// update ui.
//打印登陸數據
Toast.makeText(this@LoginActivity, it.toString(), Toast.LENGTH_LONG).show()
})
//請求數據
mLoginViewModel?.login("username","123)
}
}
這就完成了一個簡單mvvm的玩意,總的來說就是配合liveData和ViewModel的特性完成。
總結
至於一些封裝可以配合kotlin的協程,還有Retrofit發佈的2.6.0版本也支持了協程。
這樣配合着ViewModel+LiveData回調數據,更新UI這一塊也可以配合Data binding完成,
個人由於不是很感冒這個Data binding,所以就沒寫了,如果各位感興趣可以看看這快的東西。
本來打算寫一下協程+MVVM+Retrofit的相關網絡請求的內容,發現已經有小夥伴寫了,就不重複了。
Retrofit+kotlin Coroutines(協程)+mvvm(Jetpack架構組件)實現更簡潔的網絡請求
協程這一快的理解可以看看這
實戰的項目推薦
還有自己最新寫的漫畫app
ComiMTC漫畫開源項目
部分參考
真香!Kotlin+MVVM+LiveData+協程 打造 Wanandroid!
我是覺得這個很好,裏面有用到這個viewModelScope,當 ViewModel 被銷燬時它會自動取消協程任務和lamba 函數作爲方法時的回調,之前還不知道,哈哈。等等…
就到這吧,如果對你有幫助,點個贊咯-v-!!!?