Kotlin MVP Demo

作者: lkmc2 | 来源:发表于2018-02-28 13:59 被阅读96次

    MVP是一种设计模式,将项目分为Model、View、Presenter三个模块,利用中间层Presenter完成View层与Model层的数据交互。

    以下是各层的功能:
    1.Model层:业务逻辑和实体模型。
    2.View层:对应Activity,负责View的绘制以及与用户交互。
    3.Presenter层:负责完成View与Model层的交互。

    Model层

    OnLoginFinishedListener.kt

    package linchange.com.kotlinmvp.model
    
    /**
     * Created by lkmc2 on 2018/2/28.
     * 登陆结束监听器
     */
    interface OnLoginFinishedListener {
        fun onUsernameError() //用户名输入错误
        fun onPasswordError() //密码输入错误
        fun onSuccess() //登陆成功
    }
    

    LoginModel.kt

    package linchange.com.kotlinmvp.model
    
    /**
     * Created by lkmc2 on 2018/2/28.
     * 登陆模型(Model层)
     */
    interface LoginModel {
        /**
         * 登陆
         * @param username 用户名
         * @param password 密码
         * @param listener 登陆结束监听器
         */
        fun login(username: String, password: String, listener: OnLoginFinishedListener)
    }
    

    LoginModelImpl.kt

    package linchange.com.kotlinmvp.model
    
    import android.os.Handler
    import android.text.TextUtils
    
    /**
     * Created by lkmc2 on 2018/2/28.
     * 登陆模型实现类(延迟2秒后登陆,用户名和密码非空则登陆成功)
     */
    class LoginModelImpl : LoginModel {
        override fun login(username: String, password: String, listener: OnLoginFinishedListener) {
            Handler().postDelayed({
                var error = false //登陆失败标记
                if (TextUtils.isEmpty(username)) { //用户名为空
                    listener.onUsernameError() //用户名输入错误
                    error = true
                }
                if (TextUtils.isEmpty(password)) { //密码为空
                    listener.onPasswordError() //密码输入错误
                    error = true
                }
                if (!error) {
                    listener.onSuccess() //登陆成功
                }
            }, 2000)
        }
    
    }
    

    View层

    LoginView.kt

    package linchange.com.kotlinmvp.view
    
    /**
     * Created by lkmc2 on 2018/2/28.
     * 登陆界面接口(View层)
     */
    interface LoginView {
        fun showProgress() //展示进度条
        fun hideProgress() //隐藏进度条
        fun setUsernameError() //设置用户名错误
        fun setPasswordError() //设置密码错误
        fun navigateToHome() //导航到桌面
    }
    

    MainActivity.kt

    package linchange.com.kotlinmvp
    
    import android.support.v7.app.AppCompatActivity
    import android.os.Bundle
    import android.view.View
    import kotlinx.android.synthetic.main.activity_main.*
    import linchange.com.kotlinmvp.presenter.LoginPresenter
    import linchange.com.kotlinmvp.presenter.LoginPresenterImpl
    import linchange.com.kotlinmvp.view.LoginView
    import org.jetbrains.anko.toast
    
    /**
     * 主界面Activity(View层)
     */
    class MainActivity : AppCompatActivity(),
            LoginView, View.OnClickListener { //实现Login和OnClickListener接口
    
        private lateinit var  presenter: LoginPresenter //登陆Presenter(延迟初始化)
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            button.setOnClickListener(this) //为按钮设置点击事件监听器
    
            presenter = LoginPresenterImpl(this) //初始化presenter
        }
    
        override fun showProgress() {
            progress.visibility = View.VISIBLE //显示进度条
        }
    
        override fun hideProgress() {
            progress.visibility = View.GONE //隐藏进度条
        }
    
        override fun setUsernameError() {
            username.error = "用户名错误" //给用户名输入框设置错误信息
        }
    
        override fun setPasswordError() {
            password.error = "密码错误" //给密码输入框设置错误信息
        }
    
        override fun navigateToHome() {
            toast("登陆成功") //提示登陆成功
        }
    
        override fun onClick(v: View?) {
            //验证用户信息
            presenter.validateUserInfo(username.text.toString(), password.text.toString())
        }
    }
    

    Presenter层

    LoginPresenter.kt

    package linchange.com.kotlinmvp.presenter
    
    /**
     * Created by lkmc2 on 2018/2/28.
     * 登陆Presenter(Presenter层)
     */
    interface LoginPresenter {
        /**
         * 验证用户信息
         * @param username
         * @param password
         */
        fun validateUserInfo(username:String,password:String)
    
        fun onDestroy() //销毁view
    }
    

    LoginPresenterImpl.kt

    package linchange.com.kotlinmvp.presenter
    
    import linchange.com.kotlinmvp.model.LoginModel
    import linchange.com.kotlinmvp.model.LoginModelImpl
    import linchange.com.kotlinmvp.model.OnLoginFinishedListener
    import linchange.com.kotlinmvp.view.LoginView
    
    /**
     * Created by lkmc2 on 2018/2/28.
     * 登陆Presenter实现类
     */
    class LoginPresenterImpl(private var loginView: LoginView?) : LoginPresenter, OnLoginFinishedListener {
        //loginView是登陆界面
    
        private val loginModel : LoginModel //登陆模型
    
        init {
            this.loginModel = LoginModelImpl() //实例化登陆模型
        }
    
        override fun validateUserInfo(username: String, password: String) {
            loginView?.showProgress() //显示进度条
            loginModel.login(username,password, this) //使用用户名和密码登陆
        }
    
        override fun onDestroy() {
            this.loginView = null //销毁登陆界面
        }
    
        override fun onUsernameError() {
            loginView?.apply { //登陆界面非空,操作loginView中的方法
                setUsernameError() //设置用户名错误
                hideProgress() //隐藏进度条
            }
        }
    
        override fun onPasswordError() {
            loginView?.apply { //登陆界面非空,操作loginView中的方法
                setPasswordError() //设置密码错误
                hideProgress() //隐藏进度条
            }
        }
    
        override fun onSuccess() {
            loginView?.apply { //登陆界面非空,操作loginView中的方法
                navigateToHome() //回到主界面
                hideProgress() //隐藏进度条
            }
        }
    
    }
    
    登陆失败运行截图.png
    登陆成功运行截图.png

    本项目的地址:https://github.com/lkmc2/KotlinMVP

    相关文章

      网友评论

        本文标题:Kotlin MVP Demo

        本文链接:https://www.haomeiwen.com/subject/xabbxftx.html