MVP简介
相信你们对 MVC 都是比较熟悉了:M-Model-模型、V-View-视图、C-Controller-控制器,MVP做为MVC的演化版本,也是做为用户界面(用户层)的实现模式,那么相似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。html
Model
Model 是用户界面须要显示数据的抽象,也能够理解为从业务数据(结果)那里到用户界面的抽象。android
View
视图这一层体现的很轻薄,负责显示数据、提供友好界面跟用户交互就行。MVP下Activity和Fragment体如今了这一层,Activity通常也就作加载UI视图、设置监听再交由Presenter处理的一些工做,因此也就须要持有相应Presenter的引用。git
Presenter
Presenter这一层处理着程序各类逻辑的分发,收到View层UI上的反馈命令、定时命令、系统命令等指令后分发处理逻辑交由业务层作具体的业务操做,而后将获得的 Model 给 View 显示。github
MVC和MVP的区别网络
在 MVC 中:架构
View 能够与 Model 直接交互;
Controller 能够被多个 View 共享;
Controller 能够决定显示哪一个 View 。
在 MVP 中:ide
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加权限哦!
因为代码太多,完整代码未给出,源码直接下载便可