IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 框架MVP总结和测试代码(更新中) -> 正文阅读

[移动开发]Android 框架MVP总结和测试代码(更新中)

一、MVP框架设计模式基本认识
???(一) 基本概念
MVP模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块
1.模型(Model):负责处理数据的加载或者存储,比如从网络或本地数据库获取数据等;

2.视图(View):负责界面数据的展示,与用户进行交互;

3.主持人(Presenter):相当于协调者,是模型与视图之间的桥梁,将模型与视图分离开来

MVP模式的整个核心过程
在这里插入图片描述
???(二)开发中MVP框架模式的设计
1.一般MVP设计都是新建一个mvp的包名,里面分别在建model、view、presenter包名,mvp包名和页面的包名ui的activity和fragment是分开的

mvp放到activity包名下就显得很难看

2.mvp包下的文件设计
???(1) model包名下的类
设计数据处理的逻辑,这里一般还设计一个内部接口类,让presenter对象可以设置监听并得到数据。因为好多数据处理都是需要子线程的,不能马上就返回数据

???(2) view包名下的类
设计视图中需要的逻辑,都是接口方法,该类也是接口类。这个接口类也是需要固定的Activity页面来实现,并重写里面的方法,在方法里面写入页面的操作,这些重写方法能否得到回调都是Presenter对象来控制的,一般都是数据或逻辑处理完后再判断相应的方法回调

???(3) presenter包名下的类
设计activity和model的交互,既要有View对象,也要有model对象
Activity中把数据相关的逻辑操作都扔给了Presenter去做,View只负责处理与用户界面操作。而Presenter调用Model处理完数据之后,再通过View接口方法更新View显示的信息

二.下面看下MVP模式在具体项目中的使用
登录页面:

点击登录并验证成功后跳转到用户界面

???(一) 详细设计过程和思路
1.写布局页面,两个EditText和一个按钮

2.设计用户的基数User,设置用户名和密码的get和set方法

3.设计mvp中的View接口类LoginView,接口里面定义方法:获得用户的账号、获得用户的密码、登录、显示网络异常、登录验证错误这五个方法
代码:

/**
 * mvp中的View的定义
 * 用户登录界面用户的操作行为的定义
 */
public interface LoginView {

    String getAccount();//获取用户的账号,返回账号

    String getPassword();//获取用户的莫玛,返回密码

    void loginSuccess(User user);//登录的实现,需要传入用户对象

    void showNetworkError();//显示网络异常

    void showVerifyFailed();//信息验证失败,账号或密码有误

}

4.设计mvp中的model类LoginModel,这个类需要验证用户的账号和密码是否正确。并创建一个内部接口,让数据处理完成后返回时间,因为一般网络数据都是在子线程中完成,不能马上返回数据

/**
 * MVP中的model数据处理类
 * 这里处理登录时的数据
 */
public class LoginModel {

    /**
     * 处理登录业务并返回结果
     */
    public void login(String name, String password, OnLoginResultListener onLoginResultListener) {
        //一般登录都是请求服务器,验证
        //这里就简单一点,大家别介意
        if ("liwen".equals(name) && "123456".equals(password)) {
            onLoginResultListener.loginSuccess(new User(name, password));//登录成功,给他返回用户对象
        } else {
            onLoginResultListener.loginFailure();//登录失败
        }
    }

    //回调接口
    public interface OnLoginResultListener {

        void loginSuccess(User user);//登录成功后回调的方法,返回User对象

        void loginFailure();//登录失败后回掉的方法
    }
}

5.设计mvp中的Presenter类LoginPresenter,实现View和Model的交换,重点理解

/**
 * mvp中Presenter中的设计
 * 也是比较难,需要重点理解的一个
 * presenter是主持人的意思,view和model的中间者
 * 需要同时要有View的对象和Model的对象!一般做法是:在构造方法中创建model对象,并创建一个方法绑定View接口
 * 这里可以发现数据处理后或者逻辑判断完后都是给mvp中的View对象来做操作的!
 */
public class LoginPresenter {

    /**
     * 登录业务实现者,数据处理的操作者
     */
    private LoginModel mLoginModel;

    /**
     * 在构造方法中实例化model对象
     */
    public LoginPresenter() {
        mLoginModel = new LoginModel();
    }

    //视图接口对象
    private LoginView mLoginView;

    /**
     * 绑定View 的方法
     *
     * @param loginView
     */
    public void bind(MyActivity loginView) {
        mLoginView = loginView;
    }

    /**
     * 登录业务
     */
    public void login() {
        String account = mLoginView.getAccount();
        String password = mLoginView.getPassword();
        Log.e("TAG", "account:" + account + ",password" + password);
        if (checkParameter(account, password)) {
            doSomePrepare();
            //登录 ,需要处理数据,所有要在model中执行
            mLoginModel.login(account, password, new LoginModel.OnLoginResultListener() {
                //登录成功的回调方法
                @Override
                public void loginSuccess(User user) {
                    mLoginView.loginSuccess(user);   //在给视图页面返回User对象
                }

                //登录失败的回调方法
                @Override
                public void loginFailure() {
                    mLoginView.showVerifyFailed();//在给视图页面返回验证失败的结果
                }
            });
        }
    }

    /**
     * 做一些准备
     */
    private void doSomePrepare() {
        //这里可以设置按钮不可点击!否则一直点击登录也是不好
    }

    /**
     * 检测参数是否是否为空~~~
     *
     * @param account
     * @param password
     * @return
     */
    private boolean checkParameter(String account, String password) {
        if (TextUtils.isEmpty(account) | TextUtils.isEmpty(password)) {
            mLoginView.showVerifyFailed();//提示错误
            return false;
        } else if (!checkNetwork()) {
            mLoginView.showNetworkError();//提示网络错误
            return false;
        }
        return true;
    }

    /**
     * 检测网络是否可用
     */
    public boolean checkNetwork() {
        return true;//先显示可以联网,实际中要用代码判断
    }
}

上面有些方法是可以不写的,比如检查网络或做一些准备,但是实际程序中,是要做很多判断的,这里就随便啰嗦几句
6.主活动Activity,重点理解

/**
 * 登录程序示例的Activity
 * 这里需要创建presenter对象,presenter对象中是有view对象和model对象的!
 */
public class MyActivity extends Activity implements LoginView, View.OnClickListener {

    private EditText et_name;
    private EditText et_password;
    private Button btn_logon;

    private LoginPresenter loginPresenter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initView();
    }

    /**
     * 初始化数据
     */
    private void initView() {
        et_name = (EditText) findViewById(R.id.et_name);
        et_password = (EditText) findViewById(R.id.et_password);
        btn_logon = (Button) findViewById(R.id.btn_login);
        btn_logon.setOnClickListener(this);
        loginPresenter = new LoginPresenter();

        loginPresenter.bind(this);//绑定View和Presenter,因为这个Activity已经实现了接口,已经包含了View对象
    }

    /**
     * 登录按钮的监听方法
     * 这里要做后台数据的处理,需要用到Presenter
     */
    @Override
    public void onClick(View v) {
        loginPresenter.login();
    }

    /**
     * 下面五个方法都是实现LoginView后要是实现的方法
     */

    @Override
    public String getAccount() {
        return et_name.getText().toString();
    }

    @Override
    public String getPassword() {
        return et_password.getText().toString();
    }

    @Override
    public void loginSuccess(User user) {
        //登录成功后,一般是实现页面的跳转
        Toast.makeText(this, user.getName() + "登录成功", Toast.LENGTH_SHORT).show();
        //页面跳转
        Intent intent = new Intent(this, UserInfoActivity.class);
        intent.putExtra("user", user);
        startActivity(intent);
    }

    @Override
    public void showNetworkError() {
        Toast.makeText(this, "当前网络不可用", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showVerifyFailed() {
        Toast.makeText(this, "输入的用户名或密码有误", Toast.LENGTH_SHORT).show();
    }
}

上面可以看到在初始化时就创建loginPresenter对象,而loginPresenter的构造方法中也是创建了loginModel对象,Activity实现了LoginView,就相当于有了LoginView对象,这是只需要用loginPresenter绑定LoginView,这时MVP的model、view、presenter三者都已经实例化,并关联在一起了
上面语句loginPresenter绑定LoginView的是:loginPresenter.bind(this);绑定Avtivity,也是绑定View!loginPresenter中调用LoginView的方法都是在Activity中执行的
程序运行后的显示:

下载源码github地址,点击链接:loginMVP

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:44:08  更:2022-03-04 15:44:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 17:59:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码