MVP架构模式制作登录页面

来源:互联网 发布:数控铣削平面编程实例 编辑:程序博客网 时间:2024/06/05 19:48

为什么需要MVP

关于什么是MVP,以及MVC、MVP、MVVM有什么区别,这类问题网上已经有很多的讲解,你可以自行搜索或看看文末的参考文章,这里就只讲讲为什么需要MVP。 
在Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,并接受并处理来自用户的操作请求,进而作出响应。但是,随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致很容易变得庞大而臃肿。 
越小的类,bug越不容易出现,越容易调试,更容易测试,我相信这一点大家是都赞同的。在MVP模式下,View和Model是完全分离没有任何直接关联的(比如你在View层中完全不需要导Model的包,也不应该去关联它们)。 
使用MVP模式能够更方便的帮助Activity(或Fragment)职责分离,减小类体积,使项目结构更加清晰。

下面开始创建一个简单的MVP架构

首先开始建包

这个是Bean包里的Userinfo  然后我插多了一张图片  由于本人不会撤回  所以就凑合看看


这是延时操作

接下来就是SharedPreferences 进行密码保存

package com.example.day1mvp.presenter;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.SystemClock;
import android.widget.Toast;
import com.example.day1mvp.bean.UserInfo;
import com.example.day1mvp.model.IUserLoginModel;
import com.example.day1mvp.model.UserLoginModel;
import com.example.day1mvp.view.IUserLoginView;
/**
 * Created by yfeng on 2017/9/26.
 */
public class LoginPresenter {
    IUserLoginModel model;
    IUserLoginView view;
    Context context;
    SharedPreferences sp;
    public LoginPresenter(IUserLoginView view, Context context) {
        this.view = view;
        this.context = context;
        model = new UserLoginModel(context);
    }
    public void showUserInfo(){
        UserInfo info = model.getUserInfo();
        view.setTextName(info.getName());
        view.setTextPass(info.getPass());
    }
    public void savaUserInfo(){
        final String name = view.getTextName();
        final String pass = view.getTextPass();
        //
        model.saveUserInfo(name, pass);
    }
    public void login(){
        final String name = view.getTextName();
        final String pass = view.getTextPass();
        if(!name.equals("123")){
                Toast.makeText(context, "用户名错误", Toast.LENGTH_SHORT).show();
                return;
        }
        new AsyncTask<String, String ,String >(){
            @Override
            protected String doInBackground(String... params) {
                model.login(name, pass);
                return null;
            }
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                model.saveUserInfo(name, pass);
                Toast.makeText(context, "登录成功", Toast.LENGTH_SHORT).show();
            }
        }.execute();
    }
保存姓名和密码
}
package com.example.day1mvp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.example.day1mvp.presenter.LoginPresenter;
import com.example.day1mvp.view.IUserLoginView;
public class MainActivity extends AppCompatActivity implements IUserLoginView{
    Button btn;
    EditText et_name, et_pass;
    LoginPresenter presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.btn);
        et_name = (EditText) findViewById(R.id.et_name);
        et_pass = (EditText) findViewById(R.id.et_pass);
//        IUserLoginView view = MainActivity.this;
        presenter = new LoginPresenter(this, this);
        presenter.showUserInfo();
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                presenter.login();
            }
        });
    }
    @Override
    public void setTextName(String name) {
        et_name.setText(name);
    }
    @Override
    public void setTextPass(String pass) {
        et_pass.setText(pass);
    }
    @Override
    public String getTextName() {
        return et_name.getText().toString();
    }
    @Override
    public String getTextPass() {
        return et_pass.getText().toString();
    }
}
以上这些就是用MVP架构制作的登录操作

AndroidMVP存在的问题

但是在用的时候会出现一些问题: 
1. 例如当应用进入后台且内存不足的时候,系统是会回收这个Activity的。通常我们都知道要用OnSaveInstanceState()去保存状态,用OnRestoreInstanceState()去恢复状态。 但是在我们的MVP中,View层是不应该去直接操作Model的,这样做不合理,同时也增大了M与V的耦合。 
2. 界面复用问题。通常我们在APP最初版本中是无法预料到以后会有什么变动的,例如我们最初使用一个Fragment去作为界面的显示,后来在版本变动中发现这个Fragment越来越庞大,而Fragment的生命周期又太过复杂造成很多难以理解的BUG,我们需要把这个界面放到一个Activity中实现。这时候就麻烦了,要把Fragment转成Activity,这可不仅仅是改改类名的问题,更多的是一大堆生命周期需要去修改。例如参考文章2中的译者就遇到过这样的问题。 
3. Activity本身就是Android中的一个Context。不论怎么去封装,都难以避免将业务逻辑代码写入到其中。

TheMVP原理介绍

与传统androidMVP不同(原因上文已经说了),TheMVP使用Activity作为Presenter层来处理代码逻辑,通过让Activity包含一个ViewDelegate对象来间接操作View层对外提供的方法,从而做到完全解耦视图层。如下图: 
TheMVP架构图





阅读全文
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 工贸公司 重庆工贸 广东工贸 工贸学校 广东工贸职业学院 重庆工贸职业技术学院 浙江工贸职业技术学院 成都工贸职业技术学院 成都工贸职业学院 安徽工贸职业技术学院 焦作工贸职业学院 工贸职业学院 安徽工贸技术学院 贵州工贸职业学院 武汉工贸职业学院 广州工贸技师学院 广州工贸职业技术学院 广东工贸职业技术学院教务网 烟台工贸技师学院 福建工贸学校 湖南工贸技师学院 工贸技师学院 工贸职业技术学院分数线 四川工贸职业技术学院 广西工贸职业技术学院 工贸公司注册条件 工贸技术学院 烟台工贸职业技术学院 广东工贸职业技术学院宿舍 广东市工贸技师学院 广州工贸高级技工学校 成都工贸职业技术学院怎么样 工贸高级技工学校 河南工贸职业学院 浙江工贸职业技术学院轻工系 温州工贸职业技术学院 工贸是什么意思 浙江工贸职业技术学院招生网 广东工贸职业技术学校 浙江工贸学院 工贸职业技术学校