Kotlin練手項(xiàng)目(基于MVVM模式)

最近閑來有空寫了個kotlin練手小項(xiàng)目擎值,正好鞏固一下剛學(xué)的kotlin知識影兽,由于是本人的第一個Kotlin項(xiàng)目蹂空,或許部分地方寫法有待完善,歡迎指出一起交流進(jìn)步第焰。

本項(xiàng)目用的是網(wǎng)上找的開眼api买优,由某個大神爬來的數(shù)據(jù),所以只適合用于學(xué)習(xí)挺举,項(xiàng)目采用了MVVM模式杀赢,主要用到了 ViewModel、 LiveData 兩個組件湘纵,如果未接觸過的話可以先到官網(wǎng)或網(wǎng)上的一些相關(guān)博客先了解一下葵陵,如果說對于 MVVM 模式還不是很了解的話也有必要去學(xué)習(xí)一下,這里稍微說一下該項(xiàng)目 MVVM 模式的結(jié)構(gòu)圖
MVVM結(jié)構(gòu)圖

整個流程如上圖所示瞻佛,十分簡單脱篙,由 View 層發(fā)起數(shù)據(jù)請求,來到 ViewModel 交給 Model 去進(jìn)行網(wǎng)絡(luò)請求獲取數(shù)據(jù)伤柄,這里并沒涉及本地?cái)?shù)據(jù)绊困,所以 Model 層會相對簡單一些,獲取到網(wǎng)絡(luò)數(shù)據(jù)之后回到給 ViewModel 處理相應(yīng)業(yè)務(wù)邏輯(沒有就不處理)适刀,最后通過 LiveData 將數(shù)據(jù)或事件 Post 到 View 層進(jìn)行界面展示秤朗,View 用到了DataBinding 框架,如果沒有使用過的話需要先進(jìn)行學(xué)習(xí)一番笔喉。

附上三層基類代碼取视, Model:

abstract class BaseModel {

    abstract fun getObservable(): Observable<out BaseBean>

    protected fun getRestService(): RestService {
        return RestCreator.getInstance().getRestService()
    }

    fun loadData() {
        getObservable()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(object : Observer<BaseBean> {
                override fun onComplete() {
                }

                override fun onSubscribe(d: Disposable) {

                }

                override fun onNext(baseBean: BaseBean) {
                    baseBean.responCode = 1
                    baseBean.responType = ""
                    iDatasListener?.getSuccess(baseBean)
                }

                override fun onError(e: Throwable) {
                    val baseBean = BaseBean()
                    baseBean.responCode = -1
                    baseBean.responType = ""
                    baseBean.errorMessage = e.message.toString()
                    iDatasListener?.getFaild(baseBean)
                }

            })
    }

    private var iDatasListener: IDatasListener? = null

    fun setIDatasListener(iDatasListener: IDatasListener) {
        this.iDatasListener = iDatasListener
    }
}

該類邏輯主要是通過 Retrofit 獲取到網(wǎng)絡(luò)數(shù)據(jù)通過接口回調(diào)到 ViewModel 層。接著看 ViewModel 的基類代碼:

open class BaseViewModel : ViewModel(), IDatasListener {
    var baseModel: BaseModel? = null
    private val successLiveData = MutableLiveData<Any>()
    private val errorLiveData = MutableLiveData<Any>()

    fun getSuccessLiveData(): MutableLiveData<Any> = successLiveData
    fun getErrorLiveData(): MutableLiveData<Any> = errorLiveData

    open fun onSuccess(any: Any) {
        successLiveData.value = any
    }

    open fun onFail(any: Any) {
        errorLiveData.value = any
    }

    open fun loadData() {
        baseModel?.let {
            it.setIDatasListener(this)
            it.loadData()
        }
    }

    override fun getSuccess(baseBean: BaseBean) {
        onSuccess(baseBean)
    }

    override fun getFaild(baseBean: BaseBean) {
        onFail(baseBean)
    }
 }

該類主要做兩件事常挚,1.讓 Model 獲取數(shù)據(jù)作谭, 2.獲取到 Model 返回的數(shù)據(jù)之后通過 LiveData Post給 View 層。最后看一下 View 的基類實(shí)現(xiàn):

open class BaseFragment : Fragment(), IBaseView {

    override fun <T : BaseViewModel> createViewModel(viewModelClass: Class<T>): T {
        return ViewModelProviders.of(this).get(viewModelClass)
    }

    override fun registerViewModelObserver(baseViewModel: BaseViewModel) {
        baseViewModel.getSuccessLiveData().observe(this, Observer<Any> {
            if (it != null) {
                onApiSuccessCallBack(it)
            }
        })

        baseViewModel.getErrorLiveData().observe(this, Observer<Any> {
            if (it != null) {
                onApiErrorCallBack(it)
            }
        })
    }

    override fun onApiSuccessCallBack(any: Any) {
    }

    override fun onApiErrorCallBack(any: Any) {
    }

}

該類也主要做兩件事奄毡,1.創(chuàng)建 ViewModel 類折欠,2.觀察 LiveData 的數(shù)據(jù)變化進(jìn)而用于顯示界面。

嗶嗶了一會是時候給點(diǎn)該項(xiàng)目的幾個截圖了


推薦列表
熱門列表
播放詳情界面
播放詳情帶評論界面

界面比較簡單,畢竟是第一個練手項(xiàng)目锐秦,也沒想著做太復(fù)雜咪奖,最后附上項(xiàng)目地址:https://github.com/amazingokc/Eye-kotlin,歡迎下載一起學(xué)習(xí)酱床,如發(fā)現(xiàn)需要改進(jìn)的地方歡迎指正羊赵,晚安。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扇谣,一起剝皮案震驚了整個濱河市昧捷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揍堕,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汤纸,死亡現(xiàn)場離奇詭異衩茸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贮泞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門楞慈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啃擦,你說我怎么就攤上這事囊蓝。” “怎么了令蛉?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵聚霜,是天一觀的道長。 經(jīng)常有香客問我珠叔,道長蝎宇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任祷安,我火速辦了婚禮姥芥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汇鞭。我一直安慰自己凉唐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布霍骄。 她就那樣靜靜地躺著台囱,像睡著了一般蹬敲。 火紅的嫁衣襯著肌膚如雪痹雅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天害幅,我揣著相機(jī)與錄音,去河邊找鬼煎楣。 笑死豺总,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的择懂。 我是一名探鬼主播喻喳,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼困曙!你這毒婦竟也來了表伦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤慷丽,失蹤者是張志新(化名)和其女友劉穎蹦哼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體要糊,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纲熏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锄俄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片局劲。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奶赠,靈堂內(nèi)的尸體忽然破棺而出鱼填,到底是詐尸還是另有隱情,我是刑警寧澤毅戈,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布苹丸,位于F島的核電站,受9級特大地震影響苇经,放射性物質(zhì)發(fā)生泄漏谈跛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一塑陵、第九天 我趴在偏房一處隱蔽的房頂上張望感憾。 院中可真熱鬧,春花似錦令花、人聲如沸阻桅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫂沉。三九已至,卻和暖如春扮碧,著一層夾襖步出監(jiān)牢的瞬間趟章,已是汗流浹背杏糙。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚓土,地道東北人宏侍。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蜀漆,于是被迫代替她去往敵國和親谅河。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349