在第二篇博客中,用MVP实现手机号码归属地查询APP:传送门 .并简单提了一下MVC与MVP.
imooc课程学习总结
传统模式下实现一个简单的功能,Activity需要写很多代码:
NormalActivity:
package com.yinlei.mvcdemo.normal
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import com.yinlei.mvcdemo.R
import com.yinlei.mvcdemo.bean.Account
import com.yinlei.mvcdemo.callback.MCallBack
import kotlinx.android.synthetic.main.activity_normal.*
import kotlin.random.Random
class NormalActivity : AppCompatActivity(), View.OnClickListener{
override fun onClick(v: View?) {
val userInput=getUserInput()
getAccountData(userInput, object : MCallBack {
override fun onSuccess(account: Account) {
showSuccessPage(account)
}
override fun onFailed() {
showFailPage()
}
})
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_normal)
btnGetAccount.setOnClickListener(this)
}
/**
* 获取用户输入的信息
*/
private fun getUserInput(): String = EtAccount.text.toString()
/**
* 展示获取数据成功的界面
*/
private fun showSuccessPage(account: Account){
TvResult.text = "用户账号:${account.name} | 用户等级: ${account.level}"
}
/**
* 展示获取数据失败的界面
*/
private fun showFailPage(){
TvResult.text = "获取数据失败"
}
/**
* 查询账号数据
*/
private fun getAccountData(accountName: String,callback: MCallBack){
var isSuccess = Random.nextBoolean()
if(isSuccess){
val account = Account(accountName,100)
callback.onSuccess(account)
}else{
callback.onFailed()
}
}
}
Activity看起来十分臃肿,它包含了view的展示与相关逻辑的处理,假设添加一个新的功能,就需要再“填鸭式”。这些像藕丝一样。
MVC: Model View Controller 模型 - 视图- 控制器
Controller: 主要代表Activity Fragment
View: layout、View控件
Model: 数据处理(网络请求,SQL等)
对于他们的事件传递:
controller->Model: 可以让controller持有model的引用。
model-> view: 一般不直接让model持有view的引用,使用注册监听的方式实现Callback.
优点:
一定程度上实现了Model与View的分离,降低了代码的耦合性
缺点:
Controller与View难以完全解耦,并且随着项目的复杂度的提升,Controller越来越臃肿
就上面的代码而言,
controller与view难以完全解耦(activity既是控制器,又要承担部分的视图层的工作),activity太过臃肿,还承担部分业务逻辑。
所以 mvc 大致是:model < === > View/Controller
MVP: Model-View-Presenter模型
view指代acitvity、fragment
Presenter:连接model与view的纽带。
V层:
M层:
P层:
优点:
解决了mvc中controller与view过度耦合的缺点。职责划分明显。更加容易维护。
缺点:
接口数目多,project的复杂度高。presenter层将更臃肿。
Google官方发布的一个实现数据绑定的框架(实现数据与视图的双向绑定),帮助在android中更好的实现mvvm模式
即是实现mvvm的工具。
支持很好了,以前还build project、xml提示等现在都好很多
使用:【具体可查阅android developer 的jetpack的组件】
- 启用databinding
- 修改布局文件为databinding布局
- 数据绑定
Model <==> ViewModel <==> View将presenter替换成了Viewmodel..
MVVM: model -view-viewmodel 。在mvp的基础上实现了数据视图的绑定(databinding),当数据变化时,视图自动更新。当视图变化时,数据也会自动更新。
这种思想,在前端中的vue框架中就很好的体现双向绑定。
使用MVVM实现需求: 提供View,ViewModel以及Model层 将布局文件修改Databinding布局 View与ViewModel之间通过DataBinding进行通信 获取数据并展示在界面上优点:
实现了数据和视图的双向绑定,极大的简化代码。
缺点:bug难以调试,databinding还存在一些编译问题,比如BR
建议与Jetpack的组件进行配合+kotlin.
LiveData+ViewModel:
LiveData: 一个可以被观察的数据持有者,可以通过添加观察者的方式让其他组件观察他的变更。
LiveData:遵从应用程序的生命周期,如果LiveData的观察者已经被销毁了,livedata就不会通知该观察者
github: https://github.com/LeiLeiOfJava/Android-MVC-MVP-MVVM