阅读更多

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加权限哦!

 

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

 

源码点击下载

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. 《Android开发从零开始》——25.数据存储(4)
  4. Android系统配置数据库注释(settings.db)
  5. Android中不同应用间实现SharedPreferences数据共享
  6. android中文api(89)——ViewManager
  7. Android中的FILL_PARENT与WRAP_CONTENT的区别
  8. android图表ichartjs
  9. android用户界面-组件Widget-地图视图MapView

随机推荐

  1. android用sharepreference保存输入框中的
  2. Android(安卓)在程序中删除程序包
  3. Android版本和API Level对应关系 [更新到
  4. Android(安卓)Cache Partition
  5. Android之圆形旋转动画
  6. android中使用local_manifest.xml添加软
  7. Android(安卓)display架构分析(五)
  8. Android自学笔记(番外篇):全面搭建Linux环境
  9. Android中visibility属性VISIBLE、INVISI
  10. Android链式方法显示Dialog