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<IView> {

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

<uses-permission android:name="android.permission.INTERNET"/>

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

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

Android之MVP模式实现登录和网络数据加载的更多相关文章

  1. Android Volley和Gson实现网络数据加载

    Android Volley和Gson实现网络数据加载 先看接口 1 升级接口 http://s.meibeike.com/mcloud/ota/cloudService POST请求 参数列表如下 ...

  2. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  3. android 网络异步加载数据进度条

    ProgressDialog progressDialog = null; public static final int MESSAGETYPE = 0; private void execute( ...

  4. Android下设置ListView数据加载完成后执行layoutanimation

    今天使用android的volley框架写了一个简单的网络天气获取的demo. 承载数据的空间是ListView 因为是网络加载,必然先要设置ListView的默认数据,我设置的就是那个Loading ...

  5. android的MVP模式

    MVP简介 相信大家对MVC都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型. ...

  6. Android开发MVP模式解析

    http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html 在开发Android应用时,相信很多同学遇到和我一样的情况,虽然 ...

  7. Android应用中使用AsyncHttpClient来异步网络数据(转载)

    摘要: 首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测 ...

  8. Android利用tcpdump和wireshark抓取网络数据包

    Android利用tcpdump和wireshark抓取网络数据包 主要介绍如何利用tcpdump抓取andorid手机上网络数据请求,利用Wireshark可以清晰的查看到网络请求的各个过程包括三次 ...

  9. Android应用中使用AsyncHttpClient来异步网络数据

    首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测试的Ac ...

随机推荐

  1. Python: 从字典中提取子集--字典推导

    问题: 构造一个字典,它是另外一个字典的子集 answer: 最简单的方式是使用字典推导 eg1: 1. >>>prices = {'ACME': 45.23, 'AAPL': 61 ...

  2. linux常用命令:sort 命令

    sort 命令是Linux系统下一种对文件排序的工具,sort 命令功能十分强大,是 Shell 脚本编程是常用的文件排序工具. 1.命令格式: sort [选项]... [文件]... 或:sort ...

  3. 微服务:Java EE的拯救者还是掘墓人?

    有人认为,微服务的大行其道是在给Java EE下达死刑判决书.也有人认为,Java EE已死的论调可笑至极.读者朋友,你们怎么看? 引言 有人说,Java确实过于臃肿,经常“小题大做”.但PHP.No ...

  4. spring mybatis 3.2调用mysql存储过程返回多结果集(完整、亲测、可用)

    最近,有个开发提了个需求,希望中间件支持调用mysql存储过程时支持多结果集返回,因为某些原因我们使用了不少的存储过程,很多复杂的逻辑目前来看交互非常的多,所以从当前的现状来说,这个需求还是蛮合理的. ...

  5. 怎么说, 开发会很乐意去主动修改bug?

    怎么说, 开发会很乐意去主动修改bug? 一图顶上千言万语,如下:

  6. html/jquery最实用功能与注意点

    获取某元素的父元素 通常用在根据被click的td获取tbody时. parent是指取得一个包含着所有匹配元素的唯一父元素的元素集合.parents则是取得一个包含着所有匹配元素的祖先元素的元素集合 ...

  7. VC++ 进度条更新方案

    在实际开发中,如果有耗时操作,一般会在工作线程处理数据,然后处理完成后把时间传递到UI线程进行显示,切记不要在工作线程对UI进行操作. 场景: 1. 很多程序需要根据处理业务的进度来更新进度条,进度条 ...

  8. python面向对象总结!

    面向对象 Object Oriented Programming 基本单元:对象把数据和功能封装在里边,能实现很好的复用性,灵活性和扩展性. 面向对象的两个基本概念:类和对象 面向对象的基本要素:属性 ...

  9. Python3基础 file open+write 对不存在的txt进行创建与写入

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. IT人士级别的划分

    IT领袖:年入过亿(例如任正非.马化腾.李彦宏.丁磊.马云等,包括期权股票以及投资理财等收入.) IT大哥:年入千万(级别次于以上几位大佬的公司老板,不缺钱,普遍对上一条里的人物羡慕嫉妒恨.) IT精 ...