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

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

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

整個(gè)流程如上圖所示,十分簡(jiǎn)單,由 View 層發(fā)起數(shù)據(jù)請(qǐng)求,來(lái)到 ViewModel 交給 Model 去進(jìn)行網(wǎng)絡(luò)請(qǐng)求獲取數(shù)據(jù),這里并沒(méi)涉及本地?cái)?shù)據(jù),所以 Model 層會(huì)相對(duì)簡(jiǎn)單一些,獲取到網(wǎng)絡(luò)數(shù)據(jù)之后回到給 ViewModel 處理相應(yīng)業(yè)務(wù)邏輯(沒(méi)有就不處理),最后通過(guò) LiveData 將數(shù)據(jù)或事件 Post 到 View 層進(jìn)行界面展示,View 用到了DataBinding 框架,如果沒(méi)有使用過(guò)的話需要先進(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
    }
}

該類邏輯主要是通過(guò) Retrofit 獲取到網(wǎng)絡(luò)數(shù)據(jù)通過(guò)接口回調(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ù)之后通過(guò) 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)而用于顯示界面。

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


推薦列表
熱門列表
播放詳情界面
播放詳情帶評(píng)論界面

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容