零、前言
 
此篇为用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()
    }