MVP简介

相信大家对 MVC 都是比较熟悉了:M-Model-模型、V-View-视图、C-Controller-控制器,MVP作为MVC的演化版本,也是作为用户界面(用户层)的实现模式,那么类似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。

MVC详见博客: Android之MVC模式的使用

Model

Model 是用户界面需要显示数据的抽象,也可以理解为从业务数据(结果)那里到用户界面的抽象。

View

视图这一层体现的很轻薄,负责显示数据、提供友好界面跟用户交互就行。MVP下Activity和Fragment体现在了这一层,Activity一般也就做加载UI视图、设置监听再交由Presenter处理的一些工作,所以也就需要持有相应Presenter的引用。

Presenter

Presenter这一层处理着程序各种逻辑的分发,收到View层UI上的反馈命令、定时命令、系统命令等指令后分发处理逻辑交由业务层做具体的业务操作,然后将得到的 Model 给 View 显示。

MVCMVP的区别

在 MVC 中:

  • View 可以与 Model 直接交互;
  • Controller 可以被多个 View 共享;
  • Controller 可以决定显示哪个 View 。

在 MVP 中:

  • View 不直接与 Model 交互;
  • Presenter 与 View 通过接口来交互,更有利于添加单元测试;
  • 通常 View 与 Presenter 是一对一的,但复杂的 View 可能绑定多个 Presenter 来处理;
  • Presenter 也可以直接进行 View 上的渲染。

模仿登录案例:(demo中包含登录和网络数据请求

model

public class ModelSignIn implements ILoginSignIn {    @Override    public void onSignIn(String name, String pwd, IOnSetListenter listenter) {        if (name.isEmpty())        {            if (listenter!=null)            {                listenter.onError("输入用户名为空");                return;            }        }        if (pwd.isEmpty())        {            if (listenter!=null)            {                listenter.onError("输入密码为空");                return;            }        }        if(name.equals("dickyqie") && pwd.equals("123456"))        {            if (listenter!=null)            {                listenter.onError("登录成功");                return;            }        }else{            if (listenter!=null)            {                listenter.onError("登录失败");                return;            }        }    }}


presenter

public class Presenter extends BasePresenter {    ILoginSignIn iLoginSignIn=new ModelSignIn();    public void setSignIn(String name,String pwd)    {       iLoginSignIn.onSignIn(name, pwd, new ILoginSignIn.IOnSetListenter() {           IView view=getView();           @Override           public void onError(String error) {               if(view!=null){                    view.showToast(error);               }           }           @Override           public void onSccess(String repsonce) {               if(view!=null){                   view.showToast(repsonce);               }           }       });    }}


activity

public class MainActivity extends BaseActivity implements IView,View.OnClickListener{    EditText username;    EditText password;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView()    {        username=(EditText)findViewById(R.id.username);        password=(EditText)findViewById(R.id.password);        findViewById(R.id.login).setOnClickListener(this);    }    @Override    public Presenter createPersenter() {        return new Presenter();    }    @Override    public void onClick(View v) {        String name=username.getText().toString();        String pwd=password.getText().toString();        p.setSignIn(name,pwd);    }    @Override    public void showToast(String msg) {        Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_LONG).show();    }}


网络请求

public class MainActivity extends BaseActivity implements IView,View.OnClickListener {    private TextView textView;    private ProgessDialog dialog;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView(){        textView=(TextView) findViewById(R.id.text);        findViewById(R.id.btn).setOnClickListener(this);    }    @Override    public void onLoadContributorStart() {        showProgress();    }    @Override    public void onLoadContribtorComplete(String topContributor) {       //得到主线程的数据        Message msg=new Message();        msg.what=1;        msg.obj=topContributor;        handler.sendMessage(msg);    }    Handler handler=new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            dismissProgress();            textView.setText(msg.obj.toString());        }    };    @Override    public void onClick(View v) {        p.setGet();    }    @Override    public Presenter createPresenter() {        return new Presenter();    }    @Override    public void onNetWork() {        Toast.makeText(getApplicationContext(),"网络未连接",Toast.LENGTH_LONG).show();    }    @Override    public void onError() {        Toast.makeText(getApplicationContext(),"数据加载失败",Toast.LENGTH_LONG).show();        textView.setText("");    }    /***     * 启动     */    public void showProgress()    {        if(dialog==null)        {            dialog=new ProgessDialog(MainActivity.this);        }        dialog.showMessage("正在加载");    }    /***     * 关闭     */    public void  dismissProgress()    {        if(dialog==null)        {            dialog=new ProgessDialog(this);        }        dialog.dismiss();    }}


不要忘记在AndroidManifest.xml加权限哦!


由于代码太多,完整代码未给出,源码直接下载即可


源代码下载:https://github.com/DickyQie/android-development-model


更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. Android:SNS客户端开发四:数据库操作(二)
  4. Android(安卓)ListView专题之十二 分页不同的解决方案
  5. android之sqliteDatabase,sqliteOpenHelper,ContentProvider
  6. Android(安卓)Scroll详解(三):Android(安卓)绘制过程详解
  7. android 一个SQLite数据库多个数据表的基本使用框架 (带demo)
  8. 3-14 servlet 传出对象给 Android
  9. 【Android(安卓)界面效果29】研究一下Android滑屏的功能的原理,及

随机推荐

  1. 向钢铁侠学习怎样开发软件[每日前端夜话0
  2. 超酷的 CSS3 复古风格 3D 按钮
  3. HTML5 3D魔方动画
  4. 啥?听说你还在手写复杂的参数校验?
  5. 分析ARM ANDROID市场及技术结合点 转载
  6. 以后要是再写for循环,我就捶自己
  7. HTML5/CSS3 实现漂亮的 3D 滑杆插件
  8. jQuery/CSS3邮票边框的照片墙相册
  9. 2020开年,C语言重回巅峰王座!
  10. Android界面绘制_canvas解析