Kotlin实现MVP设计模式

版权声明:本文为博主原创文章,转载时请著名出处:http://blog.csdn.net/dg_summer https://blog.csdn.net/DG_summer/article/details/77455581

零、前言

此篇为用kotlin实现的简单mvp设计模式,Demo功能是登录。通过此篇文章可以学习Kotlin语言基础使用,以及理解mvp设计模式。项目源码:KotlinAndroiMVP

壹、mvp简介

这里写图片描述
View层:负责视图操作
Model层:负责数据操作
Present层:管理数据,控制界面
其他详细介绍,请百度。

贰、Model数据层

  • model层用于处理登录数据的接口
interface  LoginModell{
    fun login(username:String,password:String,listener: OnLoginFinishListener)
}
  • 处理登录事件的监听者
interface OnLoginFinishListener{
    fun onUsernameError()
    fun onPasswordError()
    fun onSuccess()
}
  • model具体实现类,这里主要用来处理数据操作
class LoginModelImp : LoginModell {
    override fun login(username: String, password: String, listener: OnLoginFinishListener) {
        Handler().postDelayed(Runnable {
                    val error: Boolean = false
                    if (TextUtils.isEmpty(username)) {
                        listener.onUsernameError()
                        Log.d("tttt",";ddd"+username)
                        return@Runnable
                    }
                    if (TextUtils.isEmpty(password)) {
                        listener.onPasswordError()
                        return@Runnable
                    }
                    if (!error) {
                        listener.onSuccess()
                    }
                }, 2000)
    }
}
}

叁、view接口层

  • LoginView里面设计的接口,主要用来处理登录的界面。登录时显示进度条,账号密码错误时的UI等
interface LoginView {
    fun showProgress()
    fun hideProcess()
    fun setUsernameError()
    fun setPasswordError()
    fun navigateTohome()
}

肆、present层

  • present主要用来连接view层和数据层
interface LoginPresenter {
    fun validateCredentials(username: String, password: String)
    fun onDestoroy()
}
  • presentImp实现LoginPresenter和OnLoginFinishListener接口,并且以loginview作为关联对象。
class LoginPresentImp(loginview: LoginView) : LoginPresenter, OnLoginFinishListener {
    lateinit var loginV: LoginView
    var loginModel: LoginModell

    init {
        loginV = loginview
        loginModel = LoginModelImp()
    }

    override fun validateCredentials(username: String, password: String) {
        if (loginV != null) {
            loginV.showProgress()
        }
        loginModel.login(username, password, this)
    }

    override fun onUsernameError() {
        if (loginV != null) {
            loginV.setUsernameError()
            loginV.hideProcess()
        }
    }

    override fun onPasswordError() {
        if (loginV != null) {
            loginV.setPasswordError()
            loginV.hideProcess()
        }
    }

    override fun onSuccess() {
        if (loginV != null) {
            loginV.navigateTohome()
            loginV.hideProcess()
        }
    }

    override fun onDestoroy() {
        loginV != null
    }
}

五、MainActivity实现

  • 类实现Loginview,并且在实现方法中做了UI具体操作。
class MainActivity : AppCompatActivity(), LoginView {
    lateinit var present: LoginPresenter
    var name:String=""
    var word:String=""

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

     fun init(){

         progress.visibility = View.GONE
         present = LoginPresentImp(this)
         button.setOnClickListener { view ->
             name= username.text.toString()
             word= password.text.toString()
             present.validateCredentials(name,word)
         }
     }

    override fun showProgress() {
        progress.visibility = View.VISIBLE
    }

    override fun hideProcess() {
        progress.visibility = View.GONE
    }

    override fun setUsernameError() {
        toast("请输入用户名",0)
    }

    override fun setPasswordError() {
        toast("请输入密码",0)
    }

    override fun navigateTohome() {
        toast("登陆成功",1)
    }


    override fun onDestroy() {
        present.onDestoroy()
        super.onDestroy()
    }

    fun toast(message: String,time:Int) {
        Toast.makeText(this, message, time).show()
    }

猜你喜欢

转载自blog.csdn.net/DG_summer/article/details/77455581