MVVM+ViewBinding+Kotlin入門

本篇博客不作原理性分析,僅對還沒有接觸過MVVM,viewbinding,甚至說是kotlin的同學一個入門練習項目,通過此篇博客,可以對MVVM架構,以及最近比較火的ViewBinding有一個初步認識。

先說Kotlin,Kotlin1.0還沒正式發佈的時候就已經開始研究了,但到現在也沒有真正的去用kotlin寫過項目,原因很簡單,公司平時做項目基本都用的java,而且當時很多第三方庫也都是用的java,並且kotlin的出世總有一種感覺是谷歌爲了擺脫甲骨文而不得已纔出的語言,所以當時大家也都沒把它當回事,畢竟還是java大法好,上天入地無所不能。在研究了其語法後,給我的印象就是語法簡潔,甚至於熟練java編程的我一時感覺無所適從(心中罵道這gr的語法),直到現在我依然有點排斥Kotlin,原因就是,

爲什麼我要去用Kotlin

而轉Kotlin開發的同學,原因也無外乎這幾個:
1.谷歌大廠出的,且定爲了安卓官方一級開發語言,必須要用;
2.很多開發者都在用了,我不用就out了;
3.公司要求用kotlin,所以我不得不用;
4.kotlin語法簡潔,有很多java沒有的新特性,開發效率高;
5…

這些理由其實都不能打動我,以至於放棄java轉投kotlin,因爲作爲一個將近10年的java開發者來說,所謂的開發效率問題是不存在的,即便我寫5行代碼,你只用寫1行代碼,在開發效率上我也絕不會比你低,除非老闆指定要用kotlin,否則就開除你,那就沒辦法了。可能大家覺得我因循守舊,排斥創新,但我是真的沒有用kotlin的慾望,因爲它僅僅是換了一個編程語言而已,對開發出來的app在編譯與運行效率上沒有任何改變,我還要花大量學習成本,以及可能在開發過程中遇到未知風險,我爲什麼要用你呢?相信有不少同學和我有同樣的心態。

但爲什麼今天又用Kotlin了呢? 其實,做程序開發是一個不斷學習的過程,一天不去接觸學習新東西,你就會落後甚至過時,所以說當出現新玩意的時候,你可以不用,但不能不會,只有這樣,你才能在職業生涯中遊刃有餘,就像今天說的這個MVVM框架,以及ViewBinding,我相信很多開發者剛把mvp模式玩6,RxJava,Retrofit弄懂,甚至於有些還在用mvc模式,你就告訴我他們統統過時了???我尼瑪,這要累死人的節奏???沒辦法,程序界發展就是這麼快,稍不留神你就已經落伍了,這也是爲什麼程序員吃青春飯這一說法的由來了,你跟不上節奏,甚至於連去跟節奏的心也沒有了,那就只能被淘汰了!

閒話說了這麼多,進入正題吧!如果你問我,目前最流行的移動端開發模式是什麼,我會毫不猶豫的告訴你:MVP+Rxjava+Retrofit+EventBus…,MVP優點自不必說,但缺點相信現在還在用MVP模式的你會深有體會,可以說成也P,敗也P,隨着項目的擴大,界面的增多,接口的增多,P會越來越多,P中的回調也會越來愈多,在某個界面想重用某個接口時,如果不想進入回調地獄,就只能再寫一個新的P,相當麻煩。還有一個缺點就是,在使用p的時候,總是要實現回調接口,再聲明p,然後attach,界面銷燬時再調用detach,否則就可能會內存泄漏,這兩點是不是不能忍?所以MVVM就出現了,對於MVVM,你可以這麼理解,M+V+VM就是把MVP的Presenter換成ViewModel,VM不但可以替代Presenter的功能,還能解決Presenter的兩個缺點,上面說過,本篇不作原理性分析,因爲這類文章太多了,再分析分析也是多次一舉,所以就直接上代碼:

ViewModel的簡單用法:
在mvp模式下,當我們有服務器交互也就是需要調用接口時,我們便會爲此界面創建一個Presenter,同樣的,mvvm模式下,我們要爲這個界面創建一個ViewModel,例如我們爲MainActivity創建MainViewModel :

class MainViewModel : ViewModel() {


}

需要繼承ViewModel,並且ViewModel中一般會配合LiveData使用:

class MainViewModel : ViewModel() {
    var data = MutableLiveData<String>()
    fun getData() {
        //模擬數據請求
        var result = "請求結果"
        data.value = result
    }
}

在MainActivity中聲明,並使用MainViewModel :

 mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)
 mainViewModel.getData()//調用方法,模擬請求數據
  mainViewModel.data.observe(this, Observer {//觀察data變化,相當於接口請求回調函數
      textView.text=it
  })

LiveData的observe,就是一個觀察者,發現數據有變化時就會立馬通知你,參數it就是MainViewModel 中 MutableLiveData(),<>中聲明的數據類型的數據,我們不要像presenter一樣 需要attach和detach,也不需要些回調接口,只用觀察,就這麼簡單!

再來看ViewBinding:
在這裏插入圖片描述
文檔連接:https://developer.android.google.cn/topic/libraries/view-binding

ViewBinding和DataBinding的區別:
ViewBinding和DataBinding均會生成可用於直接引用視圖的綁定類。不過,這兩者之間存在明顯差異:
1.DataBinding僅處理使用 代碼創建的數據綁定佈局。
2.ViewBinding不支持佈局變量或佈局表達式,因此它不能用於在 XML 中將佈局與數據綁定。

ViewBinding僅是節省了findview的步驟,並且啓用後,每當創建一個xml佈局文件,便會自動生成一個對應的ViewBinding類,僅需在界面裏的setContentView傳入ViewBinding.根視圖root即可使用,使用方法爲ViewBinding對象.id

 private lateinit var binding: ActivityMainBinding
  binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
 binding.mRecyclerView.layoutManager = LinearLayoutManager(this)
        binding.mRecyclerView.adapter = articleAdapter

使用起來也是相當簡單,另外項目中封裝了相對簡單網絡請求,

class HttpUtil {

    /**
     * 通用網絡請求方法
     */
    inline fun <reified T> getData(api: String, onResultListener: OnResultListener) {
        GlobalScope.launch(Dispatchers.Main) {
            withContext(Dispatchers.IO) {
                val data = URL(Const.BASE_URL + api).readText()
                val result = Gson().fromJson(data, T::class.java)
                withContext(Dispatchers.Main) {
                    onResultListener.onResult(result)
                }
            }
        }
    }

    /**
     * 單例模式
     */
    companion object {
        @Volatile
        private var httpUtil: HttpUtil? = null

        fun getInstance() = httpUtil ?: synchronized(this) {
            httpUtil ?: HttpUtil().also { httpUtil = it }
        }
    }

    /**
     * 網絡請求回調
     */
    interface OnResultListener {
        fun onResult(obj: Any?)
    }
}

因爲是入門項目,所以沒有任何技術難點,一看就懂,適合準備入門的開發者!

在這裏插入圖片描述

項目下載鏈接:https://download.csdn.net/download/baiyuliang2013/12358988

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