1、MVC架构
1.1 组件的互动
1.2 MVC之间的经典
PS:注意,是经典合作。不是必须这样做,这只是其中一种合作方式。在不同的项目开发里面,分别有不同的内容充当MVC。那在Android里是什么充当View,什么充当Model,什么充当Controller呢?
View:Acitivity(View)、Fragment(View)视图,在android里xml布局转成View后,加载到了Activity/Fragment里了。
Controller:Controller对应着Activity/Fragment,绑定UI,处理各种业务。
Model:数据的获取,存储,更新,domain
1.3 优点
view与model隔离,view换了,model不影响。model换其他的数据源,view层也不受影响。一个view可以连接多个model,有些model可以复用。比如说你这个页面需要用户信息,另外一个界面也需要用户信息。
1.4 缺点
这里我们主要指Android上的缺点,不适合在Android开发上使用。在Android开发中,View的相关内容和Controller都写到一起了,会让Activity/Fragment越来越臃肿
1.5 代码M层
package com.example.jetpackbysob.mvctest
import java.util.*
import kotlin.concurrent.schedule
/**
* Project_name:JetPackBySob
* Created by:ChenFuXu.
* Date: 2022/4/27 20:20
*/
class ModelTest {
private val random = Random()
// 进行登录操作
fun doLogin(
call: OnDoLoginStateChange,
account: String,
password: String
) {
call.onLoading()
// 开始去调用登录的api
// 有结果,该操作为耗时操作
Timer().schedule(3000) {
}
val randomValue = random.nextInt(2)
if (randomValue == 0) {
call.onLoginSuccess()
} else {
call.onLoginFailed()
}
}
fun checkUserState(account: String, block: (Int) -> Unit) {
/**
* 1: 表示该账号已经注册
* 0:表示该账号没有注册
*/
block.invoke(random.nextInt(2))
}
interface OnDoLoginStateChange {
// 登录中
fun onLoading()
// 登录成功
fun onLoginSuccess()
// 登录失败
fun onLoginFailed()
}
}
1.6 代码C层和V层(都在activity中)
package com.example.jetpackbysob.mvctest
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.TextUtils
import com.example.jetpackbysob.R
import com.example.jetpackbysob.mvctest.ModelTest.OnDoLoginStateChange
import kotlinx.android.synthetic.main.view_test.*
class ViewTest : AppCompatActivity(), OnDoLoginStateChange {
// view层持有model层的对象
private val userModel by lazy { // 惰性初始化,首次使用才会初始化
ModelTest()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.view_test)
initListener()
}
private fun initListener() {
text_login.setOnClickListener {
// 进行登录
toLogin()
}
}
/**
* 处理登录逻辑
* 这个地方是Controller层,持有Model对象,userModel
*/
private fun toLogin() {
// 做登录的逻辑处理
val account = account_input.text.toString()
val password = password_input.text.toString()
// 检查账号的格式是否正确
if (TextUtils.isEmpty(account)) {
// 提示账号有问题
return
}
// 检查密码长度是否正确
if (TextUtils.isEmpty(password)) {
// 提示密码有问题
return
}
// 给密码加盐
userModel.checkUserState(account) {
when(it) {
0 -> {
// 不可用,没有注册,提示注册
}
1 -> {
// 可用,已经注册了
// 禁止登录按钮可以点击, 不可以点击了,防止重复登录操作
text_login.isEnabled = false
text_login.background = resources.getDrawable(R.drawable.shape_mvc_login_press_bg)
// 进行登录,操作为异步
userModel.doLogin(this, account, password)
}
}
}
}
override fun onLoading() {
text_login.text = "登录中"
}
override fun onLoginSuccess() {
text_login.text = "登录成功"
text_login.isEnabled = true
text_login.background = resources.getDrawable(R.drawable.shape_mvc_login_normal_bg)
}
override fun onLoginFailed() {
text_login.text = "登录失败"
text_login.isEnabled = true
text_login.background = resources.getDrawable(R.drawable.shape_mvc_login_normal_bg)
}
}
PS:整个activity是V层, toLogin()函数属于逻辑控制层C层