【03】Kotlin登录MVP模式搭建

(1)一个人只要自己不放弃自己,整个世界也不会放弃你.
(2)天生我才必有大用
(3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟.
(4)做难事必有所得
(5)精神乃真正的刀锋
(6)战胜对手有两次,第一次在内心中.
(7)好好活就是做有意义的事情.
(8)亡羊补牢,为时未晚
(9)科技领域,没有捷径与投机取巧。
(10)有实力,一年365天都是应聘的旺季,没实力,天天都是应聘的淡季。
(11)基础不牢,地动天摇
(12)写博客初心:成长自己,辅助他人。当某一天离开人世,希望博客中的思想还能帮人指引方向.
(13)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~

Kotlin登录MVP模式搭建

Kotlin体系文档

【01】Kotlin语言基础学习

【02】Kotlin项目实操之Retrofit网络模型

【03】Kotlin登录MVP模式搭建

【04】Kotlin登录功能MVP基类封装

1.MVP模式搭建

在这里插入图片描述

1.1MVP接口

1.1.1Model层接口
/**
 * @author XiongJie
 * @version appVer
 * @Package com.gdc.kotlinproject.modules.login.interfaces
 * @file
 * @Description:Module层
 * @date 2021-5-9 09:44
 * @since appVer
 */
interface LoginModule {

    /**
     * 1.取消请求动作
     */
    fun cancelRequest()

    /**
     * 1.登录
     * (1)接口回调:把data结果,给Presenter层
     */
    fun login(
        context : Context,
        username : String,
        password:String,
        onLoginListener:LoginPresenter.OnLoginListener
    )
}
1.1.2Presenter层接口
/**
 * @author XiongJie
 * @version appVer
 * @Package com.gdc.kotlinproject.modules.login.interfaces
 * @file
 * @Description:Presenter层
 * @date 2021-5-9 09:41
 * @since appVer
 */
interface LoginPresenter {

    /**
     * 1.登录
     * (1)context是为了给网络模型用的
     */
    fun loginAction(context : Context,username:String,password : String)

    /**
     * 监听接口回调
     */
    interface OnLoginListener{
        fun loginSucess(loginBean: LoginResponse?)

        fun loginFailure(errorMsg : String ?)
    }
}
1.1.3View层接口
/**
 * @author XiongJie
 * @version appVer
 * @Package com.gdc.kotlinproject.modules.login.interfaces
 * @file
 * @Description:
 * 1.MVP模式View抽象层
 * @date 2021-5-8 13:12
 * @since appVer
 */
interface LoginView {

    /**
     * 1.把结果显示到Activity / Fragment
     * ? 允许为null
     */
    fun loginSucess(loginBean: LoginResponse ?)

    /**
     * 2.失败
     */
    fun loginFailure(errorMsg : String ?)

}

1.2MVP接口实现

1.2.1Model层接口实现
/**
 * @author XiongJie
 * @version appVer
 * @Package com.gdc.kotlinproject.modules.login
 * @file
 * @Description:Model的实现层
 * @date 2021-5-9 09:55
 * @since appVer
 */
class LoginModelImpl :LoginModule{

    override fun cancelRequest() {

    }

    override fun login(
        context: Context,
        username: String,
        password: String,
        onLoginListener: LoginPresenter.OnLoginListener) {
        APIClient.instance.instanceRetrofit(WanAndroidAPI::class.java)

            //1.1全部都是RxJava知识了
            //1.1.1创建被观察者,经过此步骤会返回一个Observable对象,它是RxJava的起点
            //1.1.2将LoginResponseWrapper丢给RxJava慢慢的往传递,直到传给UI界面控件
            .loginAction(username, password)

            //1.1.3因为请求与响应是耗时操作,所以将其放到异步线程中执行。
            .subscribeOn(Schedulers.io())

            //1.1.4将下面更新UI的操作,分配到main线程中执行
            .observeOn(AndroidSchedulers.mainThread())

            .subscribe(object : APIResponse<LoginResponse>(context) {
                override fun success(data: LoginResponse?) {
                    Log.i(Flag.TAG, "success:$data")
                    //1.成功
                    onLoginListener.loginSucess(data)
                }

                override fun failure(errorMsg: String?) {
                    Log.i(Flag.TAG, "success:$errorMsg")
                    //2.失败
                    onLoginListener.loginFailure(errorMsg)
                }
            })
    }
}
1.2.2Presenter层接口实现
/**
 * @author XiongJie
 * @version appVer
 * @Package com.gdc.kotlinproject.modules.login
 * @file
 * @Description:Presenter层实现
 * (1)私有构造方法
 * private constructor(var loginView:LoginView)
 *
 *
 * @date 2021-5-9 09:54
 * @since appVer
 */
class LoginPresenterImpl constructor(var loginView:LoginView) : LoginPresenter,LoginPresenter.OnLoginListener{

    private val loginModel : LoginModelImpl = LoginModelImpl()

    /**
     * TODO
     * (1)输入校验
     * (2)其他事项
     * (3)调用Model层
     * (4)需要Model层请求服务器
     * (5)需要View层去更新tivity/Fragment
     */
    override fun loginAction(context: Context, username: String, password: String) {
        loginModel.login(context,username,password,this)
    }

    /**
     * 1.接收Model的结果集
     * (1)使用接口的回调实现
     * (2)LoginPresenter.OnLoginListener
     */
    override fun loginSucess(loginBean: LoginResponse?) {
        loginView.loginSucess(loginBean)
    }

    override fun loginFailure(errorMsg: String?) {
        loginView.loginFailure(errorMsg)
    }

}
1.2.3View层接口实现
/**
 * 1.登录界面
 * (1)View层,只需要关注P层,实现Presenter层
 */
class LoginActivity : AppCompatActivity() ,LoginView{

    /**
     * 1.P层接口
     * (1)懒加载,即先不实例化
     */
    lateinit var p : LoginPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
        user_login_bt.setOnClickListener(onClickListener)
        p = LoginPresenterImpl(this);
    }

    /**
     * 1.kotlin与java的无缝交互
     * 1.1view.id不需要写view.getId()或view.setId()是因为Kotlin中自动判断调用哪个方法
     * 1.1.1id的值由内部根据"="知道你是调用get还是set方法
     * 1.1.2WanAndroidAPI::class.java 对应 WanAndroidAPI.class
     * 1.1.3val api = APIClient.instance.instanceRetrofit(WanAndroidAPI::class.java)
     */
    private val onClickListener = View.OnClickListener { view ->
        when (view.id) {
            //1.登录
            R.id.user_login_bt -> {
                val userName = user_phone_et.text.toString()
                val userPwd = user_password_et.text.toString()
                Log.d(Flag.TAG, "userName:$userName,userPwd:$userPwd")

                //1.1调用Presenter层实现业务
                p.loginAction(this@LoginActivity,userName,userPwd)

            }
        }
    }

    /**
     * 响应
     */
    override fun loginSucess(loginBean: LoginResponse?) {
        Toast.makeText(this@LoginActivity, "登录成功", Toast.LENGTH_SHORT).show()
    }

    override fun loginFailure(errorMsg: String?) {
        Toast.makeText(this@LoginActivity, "登录失败", Toast.LENGTH_SHORT).show()
    }
}

2.打赏鼓励

感谢您的细心阅读,您的鼓励是我写作的不竭动力!!!

2.1微信打赏

在这里插入图片描述

2.2支付宝打赏

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值