最近闲来有空写了个kotlin练手小项目,正好巩固一下刚学的kotlin知识,由于是本人的第一个Kotlin项目,或许部分地方写法有待完善,欢迎指出一起交流进步。
本项目用的是网上找的开眼api,由某个大神爬来的数据,所以只适合用于学习,项目采用了MVVM模式,主要用到了 ViewModel、 LiveData 两个组件,如果未接触过的话可以先到官网或网上的一些相关博客先了解一下,如果说对于 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,欢迎下载一起学习,如发现需要改进的地方欢迎指正,晚安。