Android 對於MVVM模式的理解

前言

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架構組件)實現更簡潔的網絡請求

協程這一快的理解可以看看這

Kotlin 的協程用力瞥一眼

實戰的項目推薦

還有自己最新寫的漫畫app
ComiMTC漫畫開源項目

部分參考
真香!Kotlin+MVVM+LiveData+協程 打造 Wanandroid!

我是覺得這個很好,裏面有用到這個viewModelScope,當 ViewModel 被銷燬時它會自動取消協程任務和lamba 函數作爲方法時的回調,之前還不知道,哈哈。等等…

就到這吧,如果對你有幫助,點個贊咯-v-!!!?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章