IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> kotlin实战---MVP模式实现登录,实现Base层封装,安卓开发面试书籍 -> 正文阅读

[移动开发]kotlin实战---MVP模式实现登录,实现Base层封装,安卓开发面试书籍


说到MVP就先来说一说MVC,其实MVC是一个伟大的一种模式,只不过随着项目越来越大,在Android中MVC就显得不太好用,Activity承载了太多,既承担view的责任又称但控制层的责任,有时候还捎带model的东西,违反了单一职责原则,项目比较大的话,如果使用MVC,Activity上千行代码是很常见的,MVP就应运而生 在这里插入图片描述 在开发的过程中,也不是说我们非得用MVP,架构模式没有必须用和不用,只有合适不合适,根据项目选用正确的架构模式,才是以为优秀的程序员做的事情,比如非常小的项目 就不需要用MVP,MVP的缺点要写好多接口和实现类比较麻烦,实现一个很小的一个项目用MVP就有点浪费时间。项目比较大,项目的模块类就比较多,所以用MVP就很容易实现分层和解耦,就相比较MVC来说比较容易维护

2、接口和实现类的设计

为了方便大家理解,画一张图

在这里插入图片描述

2.1、View层的实现

View层只负责数据的展示,并向Presenter层发出网络请求命令,接收Presenter层的数据回调 BaseActivity

//P extends BasePresenter          KT      P:IBasePresenter
//P extends BasePresenter &Serializable   KT  class BaseActivity<P>:AppCompatActivity() where P:IBasePresenter,P:Serializable
 abstract  class BaseActivity<P:IBasePresenter>:AppCompatActivity(){
     lateinit var presenter:P
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        presenter=createP()
        setContentView(getLayoutID())
    }

    abstract fun getLayoutID(): Int

    abstract fun createP(): P

    override fun onDestroy() {
        super.onDestroy()
        recycle()
    }

    abstract fun recycle()
} 

LoginView

//View层
interface LoginView {
    //把结果显示到Activity/Fragment层
    fun loginSuccess(loginBean:LoginResponse?)
    fun loginFialure(errorMsg:String?)

} 

LoginActivity

class LoginActivity : BaseActivity<LoginPresenter>(),LoginView {


    private lateinit var mMediaPlayer:MediaPlayer
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        initView()
    }

    private fun initView() {
       user_login_bt.setOnClickListener {

           doLogin()
       }
    }

    private fun doLogin() {
        val userName=user_phone_et.text.toString()
        val pwd=user_password_et.text.toString()
        //只关心P层
        presenter.loginAction(this@LoginActivity,userName,pwd)
//            .
    }
    override fun getLayoutID(): Int = R.layout.activity_login

    override fun createP(): LoginPresenter =LoginPresenterImpl(this)

    override fun recycle() {
        presenter.unAttachView()
    }

    override fun loginSuccess(loginBean: LoginResponse?) {
//        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        Toast.makeText(this@LoginActivity,"登陆成功嘿嘿~",Toast.LENGTH_SHORT).show()
    }

    override fun loginFialure(errorMsg: String?) {
//        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        Toast.makeText(this@LoginActivity,errorMsg,Toast.LENGTH_SHORT).show()
    }
} 

2.2、Presenter层的实现

Presenter类的完全把Model层和View层进行隔离,Model和View要产生联系,所以Presenter必须拿到Model层和View层 IBasePrensenter

interface IBasePresenter {
//    fun attachView()
    //视图离开了
    fun  unAttachView()
} 

LoginPresenter

//Presenter 层
interface LoginPresenter:IBasePresenter {
    //登录
    fun loginAction(context:Context,userName:String,password:String)

    //监听回调
    interface  OnLoginListener{
        fun loginSuccess(loginBean: LoginResponse?)
        fun loginFialure(errrMsg:String?)
    }
} 

LoginPresenterImpl

//P 层是需要拿到 Model和View两边的
class LoginPresenterImpl(var loginView: LoginView?) :LoginPresenter,LoginPresenter.OnLoginListener {
    
    //Model  请求服务器
    private val loginModel=LoginModelImpl()
    //view 去更新UI

    override fun loginAction(context: Context, userName: String, password: String) {
        //        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        //做很多事情 校验 啊
        // TODO 调用模型层
not implemented") //To change body of created functions use File | Settings | File Templates.
        //做很多事情 校验 啊
        // TODO 调用模型层
 
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 12:02:26  更:2021-09-01 12:02:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:45:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码