ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

小白用Android MVP-初体验(一)

2019-03-29 16:39:26  阅读:302  来源: 互联网

标签:MVP 初体验 String void ResultBean login Android public View


写android以来,一直都是采用MVC的模式,所有的业务逻辑,网络请求等都放在了View中,即Activity或者Fragment中。看了一些mvp文章,很多跨度较大,也因为自己造诣不够,还不能跟上大神门的思路。今天自己初次尝试MVP,准备一步一步慢慢来,这是第一篇-初体验,用我们常用的熟悉的登录业务引入;

介绍

MVC

M:逻辑控制,V:试图模型,C:控制器, 耦合性强,不利于后期维护,适合在一些较小的项目中使用;

MVP

Model: 具体的数据源和数据请求,访问数据库和后台服务器等;
View:扶着UI,Activity,Fragment;
Presenter:是View和Model的桥梁,负责接收View发来的指令,并据此调用model中的方法;

  • 释放了View,作为View 来说只需要负责UI。耦合度降低。
  • 引入了Presenter,会导致其越来越臃肿,同样不利于后期的维护,并且,每一个包含网络请求的View都需要对应一个或者多个Presenter。

    实现

    登录活动(Activity)

很简单,点击登录执行登录过程;
界面

DataModel

首先来看Model层,一般Model层需要和数据库或者后台服务器交互,这里模拟即可。

package com.mypractisedemos.module.mvpdemo;

/**
 * <pre>
 *  Created by fanjiajia on 2019/3/29.
 *  desc:
 */

public class DataModel {

    public void login(String userName, String Password, iCallBack<ResultBean> callBack) {

        ResultBean bean; // 封装返回的bean

        // 登录验证
        if (userName.equals("张三") && Password.equals("123456")) {

           bean = new ResultBean("200", "登录成功", "");

            callBack.callSuccess(bean);
        }else {
            bean = new ResultBean("110", "登录失败", "");
            callBack.callFailure(bean);
        }
    }
}

这里有个iCallback,故名思义,是结果的回调。看看他的定义;

package com.mypractisedemos.module.mvpdemo;

/**
 * <pre>
 *  Created by fanjiajia on 2019/3/29.
 *  desc:
 */

public interface iCallBack<ResultBean>{

    void callError(ResultBean bean);

    void callSuccess(ResultBean bean);

    void callFailure(ResultBean bean);

    void callException(ResultBean bean);
}

这里有四种情况,成功,失败,异常,和错误。每一个回调都需要有个ResultBean,来看看这个回调对象的定义;

package com.mypractisedemos.module.mvpdemo;

/**
 * <pre>
 *  Created by fanjiajia on 2019/3/29.
 *  desc: 回调对象
 */

public class ResultBean {

    private String code;    // 状态码

    private String msg; // 消息

    private String data;    // 数据 json格式

    public String getCode() {
        return code == null ? "" : code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg == null ? "" : msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getData() {
        return data == null ? "" : data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public ResultBean(String code, String msg, String data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    @Override
    public String toString() {
        return "ResultBean{" +
                "code='" + code + '\'' +
                ", msg='" + msg + '\'' +
                ", data='" + data + '\'' +
                '}';
    }
}

这个参考了之前学长封装的一个OkHttp3工具的回调对象,用在这里了。

iView

看了Model层,现在看看试图接口定义一个接口,如下:

package com.mypractisedemos.module.mvpdemo;

/**
 * <pre>
 *  Created by fanjiajia on 2019/3/29.
 *  desc:
 */

public interface iView {

    void loginSuccess(String resultMsg); // 登录成功回调

    void loginFailure(String failureMsg);// 登录失败回调
}

这里很简单,主要是登录活动的回调。

DataPresenter

然后开看看Presenter,之前说了这是model和view的桥梁,当点击登录按钮之后,肯定会调用其中的相应方法。先看定义;

package com.mypractisedemos.module.mvpdemo;

/**
 * <pre>
 *  Created by fanjiajia on 2019/3/29.
 *  desc:
 */

public class DataPresenter {

    private iView mView;// 视图View

        private DataModel mModel;// 数据Model

        public DataPresenter(iView view) { // 构造 
        this.mView = view;
        this.mModel = new DataModel();
    }

    /**
     * 定义View会发起的动作
     */

    public void login(String userName, String password) {

        mModel.login(userName, password, new iCallBack<ResultBean>() {
            @Override
            public void callError(ResultBean resultBean) {

            }

            @Override
            public void callSuccess(ResultBean resultBean) {
                mView.loginSuccess(resultBean.getMsg());
            }

            @Override
            public void callFailure(ResultBean resultBean) {
                mView.loginFailure(resultBean.getMsg());
            }

            @Override
            public void callException(ResultBean resultBean) {

            }
        });
    }
}

这里看到他有两个属性,一个是View,另一个是Model,这就是为什么他是二者的桥梁。这里面的login方法中直接调用model的登录方法,然后通过iCallBack回调。

Activity

最后来看看我们之前操作比较多的View

package com.mypractisedemos.module.mvpdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.jiajia.mypractisedemos.R;

import butterknife.BindView;
import butterknife.ButterKnife;

public class LoginMvpActivity extends AppCompatActivity implements iView{ // 实现iView接口

    @BindView(R.id.et_mvp_login_username)
    EditText et_username; // 用户名
    @BindView(R.id.et_mvp_login_password)
    EditText et_password;   // 密码
    @BindView(R.id.btn_mvp_login_login)
    Button btn_login; // 登录按钮

    private DataPresenter mPresenter; // 声明Presenter

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_mvp);

        ButterKnife.bind(this); // ButterKnift框架的使用

        mPresenter = new DataPresenter(this); // 绑定自己的Presenter

    }

    public void login(View view) { // 登录按钮的onClick事件

        mPresenter.login(String.valueOf(et_username.getText()), String.valueOf(et_password.getText()));
    }

    @Override
    public void loginSuccess(String resultMsg) {
        Toast.makeText(this, resultMsg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void loginFailure(String failureMsg) {
        Toast.makeText(this, failureMsg, Toast.LENGTH_SHORT).show();

    }
}

这里我们的activity实现iView接口,并实现相应的方法即可!

分析

最后看看我的结构,果然是小白,因为把所有的东西都放在这个包下,没有层次感,因为是第一次尝试,只关注了实现思路本身。后面再进行分类。
结构
这里没有做内存泄漏的处理,来看看为何会导致内存泄漏,在activity中我们mPresenter = new DataPresenter(this); // 绑定自己的Presenter,注意,这里的this,然后在DataPresenter中this.mView = view;,这就说明了,Presenter持有了View的引用,而View(Activity)如果被切换,导致销毁,但是Presenter持有其强引用,导致无法被GC回收,因此导致这个Activity泄漏。下一篇再谈;
GitHub: MVP-初体验(一)

最后

小白拙见!
此致,敬礼!

标签:MVP,初体验,String,void,ResultBean,login,Android,public,View
来源: https://www.cnblogs.com/numen-fan/p/10622225.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有