Android-Kotlin+MVP 实现登录注册功能

如题,采用MVP的框架模式,使用Kotlin编写实现了基础的登录和注册功能,包括一些回调的响应,效果图如下:

首先看下使用MVP的项目部分结构:

PS:如果还不了解MVP模式的同学可以看这篇或者自行搜索:https://blog.csdn.net/chunqiuwei/article/details/80460108

个人感觉MVP模式的好处很多,一点就是在抽离接口的时候能够合理的梳理业务的功能点,后期方便维护和测试等等。采用MVP模式的登录逻辑架构图大概如下,还是很明显能看出MVC和MVP的区别:


先梳理一下View层需要什么抽象接口,按照一般登录的逻辑来,LoginView 抽离 登录成功 和 登录失败 两个接口,代码如下:

LoginView.kt

package wanandroid.xuboyu.com.wanandroid.view

import wanandroid.xuboyu.com.wanandroid.bean.LoginResponse

/**
 * use:登录界面抽离接口
 * author: XuBoYu
 **/

interface LoginView {

    /**
     * 登录成功
     * @param result
     */
    fun loginSuccess(result: LoginResponse)

    /**
     * 登录失败返回失败信息(可为空)
     * @param errorMsg
     */
    fun loginFailed(errorMsg: String?)

}

注册部分按照注册成功和注册失败两个接口进行处理:

RegisterView.kt

package wanandroid.xuboyu.com.wanandroid.view

import wanandroid.xuboyu.com.wanandroid.bean.LoginResponse

/**
 * use:注册界面接口抽离
 * author: XuBoYu
 **/
interface RegisterView {

    /**
     * 注册成功
     * @param result
     */
    fun registerSuccess(result: LoginResponse)

    /**
     * 注册失败
     * @param errorMsg
     */
    fun registerFailed(errorMsg: String?)
}

接下来在 Model 层的相关业务逻辑处理回调,登录和注册部分都只需要处理成功和失败的回调,所以回调按照下面处理:

package wanandroid.xuboyu.com.wanandroid.presenter

import wanandroid.xuboyu.com.wanandroid.bean.LoginResponse

/**
 * use:回调处理
 * author: XuBoYu
 **/

interface HomePresenter {

    /**
     * login 监听接口
     */
    interface OnLoginListener {
        /**
         * 登录
         * @param username username
         * @param password password
         */
        fun loginWanAndroid(username: String, password: String)

        /**
         * 登录成功
         * @param result LoginResponse
         */
        fun loginSuccess(result: LoginResponse)

        /**
         * 登录失败
         * @param errorMessage error message
         */
        fun loginFailed(errorMessage: String?)
    }

    /**
     * register 监听接口
     */
    interface OnRegisterListener {
        /**
         * 注册
         * @param username username
         * @param password password
         * @param repassword repassword
         */
        fun registerWanAndroid(username: String, password: String, repassword: String)

        /**
         * 注册成功
         * @param result LoginResponse
         */
        fun registerSuccess(result: LoginResponse)

        /**
         * 注册失败
         * @param errorMessage error message
         */
        fun registerFailed(errorMessage: String?)
    }

}

然后是分别在登录和注册的Presenter中去处理实现这些接口:

LoginPresenter:

package wanandroid.xuboyu.com.wanandroid.presenter

import wanandroid.xuboyu.com.wanandroid.bean.LoginResponse
import wanandroid.xuboyu.com.wanandroid.model.HomeModel
import wanandroid.xuboyu.com.wanandroid.model.HomeModelImpl
import wanandroid.xuboyu.com.wanandroid.view.LoginView
import kotlin.math.log

/**
 * use:登录presenter接口
 * author: XuBoYu
 **/
class LoginPresenterImpl(private val loginView: LoginView) : HomePresenter.OnLoginListener{

    private val homeModel: HomeModel = HomeModelImpl()

    override fun loginWanAndroid(username: String, password: String) {
        homeModel.loginWanAndroid(this,username,password)
    }

    override fun loginSuccess(result: LoginResponse) {
        if (result.errorCode != 0) {
            loginView.loginFailed(result.errorMsg)
        } else {
            loginView.loginSuccess(result)
//            loginView.loginRegisterAfter(result)
        }
    }

    override fun loginFailed(errorMessage: String?) {
        loginView.loginFailed(errorMessage)
    }

}

RegisterPresenter:

package wanandroid.xuboyu.com.wanandroid.presenter

import wanandroid.xuboyu.com.wanandroid.bean.LoginResponse
import wanandroid.xuboyu.com.wanandroid.loge
import wanandroid.xuboyu.com.wanandroid.model.HomeModel
import wanandroid.xuboyu.com.wanandroid.model.HomeModelImpl
import wanandroid.xuboyu.com.wanandroid.view.RegisterView

/**
 * use:注册presenter接口
 * author: XuBoYu
 **/
class RegisterPresenterImpl(private val registerView: RegisterView) : HomePresenter.OnRegisterListener {

    private val homeModel: HomeModel = HomeModelImpl()

    override fun registerWanAndroid(username: String, password: String, repassword: String) {
        homeModel.registerWanAndroid(this, username, password, repassword)
    }

    override fun registerSuccess(result: LoginResponse) {
        if (result.errorCode != 0) {
            registerView.registerFailed(result.errorMsg)
        } else {
            registerView.registerSuccess(result)
        }
    }

    override fun registerFailed(errorMessage: String?) {
        registerView.registerFailed(errorMessage)
    }

}

最后是在model层中去完成相关的IO操作,并根据结果回调不用的view:

package wanandroid.xuboyu.com.wanandroid.model

import kotlinx.coroutines.experimental.Deferred
import kotlinx.coroutines.experimental.android.UI
import kotlinx.coroutines.experimental.async
import wanandroid.xuboyu.com.wanandroid.bean.LoginResponse
import wanandroid.xuboyu.com.wanandroid.cancelByActivite
import wanandroid.xuboyu.com.wanandroid.common.Constant
import wanandroid.xuboyu.com.wanandroid.presenter.HomePresenter
import wanandroid.xuboyu.com.wanandroid.retrofit.RetrofitHelper
import wanandroid.xuboyu.com.wanandroid.tryCatch

/**
 * use:首页Model实现类
 * author: XuBoYu
 **/
class HomeModelImpl : HomeModel{

    /**
     * Login async
     */
    private var loginAsync: Deferred<LoginResponse>? = null
    /**
     * Register async
     */
    private var registerAsync: Deferred<LoginResponse>? = null

    override fun loginWanAndroid(
            onLoginListener: HomePresenter.OnLoginListener,
            username: String,
            password: String) {

            async(UI) {
                tryCatch({
                    //catch区块
                    it.printStackTrace()
                    onLoginListener.loginFailed(it.toString())
                }) {
                    //try区块
                    loginAsync?.cancelByActivite()//存活取消
                    loginAsync = RetrofitHelper.retrofitService.loginWanAndroid(username, password)
                    val result = loginAsync?.await()
                    result ?: let {
                        onLoginListener.loginFailed(Constant.RESULT_NULL)
                        return@async
                    }
                    result?.let { onLoginListener.loginSuccess(it) }
                }
            }

    }

    override fun registerWanAndroid(
            onRegisterListener: HomePresenter.OnRegisterListener,
            username: String,
            password: String,
            repassword: String) {

        async(UI) {
            tryCatch ({
                //catch区块
                it.printStackTrace()
                onRegisterListener.registerFailed(it.toString())
            }) {
                //try区块
                registerAsync?.cancelByActivite()//存活取消
                registerAsync = RetrofitHelper.retrofitService.registerWanAndroid(username,password,repassword)
                val result = registerAsync?.await()
                result ?: let {
                    onRegisterListener.registerFailed(Constant.RESULT_NULL)
                    return@async
                }
                result?.let { onRegisterListener.registerSuccess(it) }
            }
        }
    }
}

 

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,我可以为你解答关于Android MVP模式和使用Kotlin模拟登录的问题。 首先,MVP模式是一种架构模式,它将应用程序分为三个部分:模型(Model),视图(View)和控制器(Presenter)。MVP模式的主要目的是将业务逻辑和用户界面分离,从而实现更好的代码可读性和可维护性。 在Android开发中,MVP模式通常用于处理复杂的UI和业务逻辑。下面是一个使用Kotlin模拟登录的Android MVP模式示例: 1. 创建一个包含登录逻辑的模型 ```kotlin interface LoginModel { fun login(username: String, password: String, callback: LoginCallback) } interface LoginCallback { fun onSuccess() fun onFailure(error: String) } class LoginModelImpl : LoginModel { override fun login(username: String, password: String, callback: LoginCallback) { // 模拟登录 if (username == "admin" && password == "123456") { callback.onSuccess() } else { callback.onFailure("用户名或密码错误") } } } ``` 2. 创建一个视图接口和一个实现视图接口的Activity ```kotlin interface LoginView { fun showLoading() fun hideLoading() fun showToast(msg: String) } class LoginActivity : AppCompatActivity(), LoginView { private lateinit var presenter: LoginPresenter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) presenter = LoginPresenterImpl(this, LoginModelImpl()) btn_login.setOnClickListener { presenter.login(et_username.text.toString(), et_password.text.toString()) } } override fun showLoading() { // 显示加载中 } override fun hideLoading() { // 隐藏加载中 } override fun showToast(msg: String) { // 显示Toast } } ``` 3. 创建一个控制器(Presenter)来连接模型和视图 ```kotlin interface LoginPresenter { fun login(username: String, password: String) } class LoginPresenterImpl(private val view: LoginView, private val model: LoginModel) : LoginPresenter { override fun login(username: String, password: String) { view.showLoading() model.login(username, password, object : LoginCallback { override fun onSuccess() { view.hideLoading() view.showToast("登录成功") } override fun onFailure(error: String) { view.hideLoading() view.showToast(error) } }) } } ``` 在此示例中,LoginActivity是视图,LoginPresenterImpl是控制器(Presenter),LoginModelImpl是模型。当用户单击“登录”按钮时,LoginActivity将调用LoginPresenterImpl的login方法,该方法将调用LoginModelImpl的login方法进行模拟登录。如果登录成功,LoginPresenterImpl将通知LoginActivity以显示“登录成功”消息;否则,它将通知LoginActivity显示错误消息。 希望这个示例可以帮助你理解Android MVP模式和使用Kotlin模拟登录的实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值