Android开发积累Kotlin

Kotlin练手项目(基于MVVM模式)

2020-01-13  本文已影响0人  amazingokc

最近闲来有空写了个kotlin练手小项目,正好巩固一下刚学的kotlin知识,由于是本人的第一个Kotlin项目,或许部分地方写法有待完善,欢迎指出一起交流进步。

本项目用的是网上找的开眼api,由某个大神爬来的数据,所以只适合用于学习,项目采用了MVVM模式,主要用到了 ViewModel、 LiveData 两个组件,如果未接触过的话可以先到官网或网上的一些相关博客先了解一下,如果说对于 MVVM 模式还不是很了解的话也有必要去学习一下,这里稍微说一下该项目 MVVM 模式的结构图 MVVM结构图

整个流程如上图所示,十分简单,由 View 层发起数据请求,来到 ViewModel 交给 Model 去进行网络请求获取数据,这里并没涉及本地数据,所以 Model 层会相对简单一些,获取到网络数据之后回到给 ViewModel 处理相应业务逻辑(没有就不处理),最后通过 LiveData 将数据或事件 Post 到 View 层进行界面展示,View 用到了DataBinding 框架,如果没有使用过的话需要先进行学习一番。

附上三层基类代码, 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 获取到网络数据通过接口回调到 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 获取数据, 2.获取到 Model 返回的数据之后通过 LiveData Post给 View 层。最后看一下 View 的基类实现:

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.创建 ViewModel 类,2.观察 LiveData 的数据变化进而用于显示界面。

哔哔了一会是时候给点该项目的几个截图了


推荐列表 热门列表 播放详情界面 播放详情带评论界面

界面比较简单,毕竟是第一个练手项目,也没想着做太复杂,最后附上项目地址:https://github.com/amazingokc/Eye-kotlin,欢迎下载一起学习,如发现需要改进的地方欢迎指正,晚安。

上一篇下一篇

猜你喜欢

热点阅读