面试记录第二十节——(MVP讲解)
来源:互联网 发布:淘宝详情页是什么意思 编辑:程序博客网 时间:2024/06/05 19:39
一、前言
注意:MVC功能很强大,但是他也有很多不好的缺点,因为在Android中,相比传统的MVC设计模式,它的view层它对应的是我们Android中的布局XML,但是这个xml文件并不想java web端那么强大,能做的事情其实非常有限,而controller对应的activity类不仅要处理业务逻辑,他也要处理Android当中一些操作UI的功能,我们在实际开发项目中,有很多的UI操作的业务逻辑都写在了这个activity当中,但这个类明显有很多视图层所做的事情,这样就导致了controller这个层非常的冗余和厚重,为了改善这一点,我们引入了今天的重点:MVP架构。
二、MVP((Model View Presenter)定义)
答:当我们吧架构从MVC演变成MVP之后,他出现了Presenter,它的主要意思就是说,我们会将activity层视为view层,而presenter负责activity和modle层数据的交互。
- 具体如下
M:依然是业务逻辑层和实体模型
V:对应于Activity,负责View的绘制以及用户交互。
P:负责完成View于Model间的交互
三、MVP讲解
答:MVP之所有有如此大的优势,绝对不仅仅是MVC到MVP的名字转变,他更是把我们Activity这个类和业务逻辑抽出来,将一些复杂的代码抽到presenter当中进行处理,这样的好处就是MVP的设计模式他会比MVC更加的耦合度底如下图01:
我们会发现两者的区别,MVP的Model层不会和View直接交互,他们是通过presenter层这个中介进行交互。而MVC这个架构中,视图View层和数据Model层是可以直接进行交互的。两者的对比就会发现这个差异就是MVP最大的优点。我们在Android中很重要的一点就是,你只能在主线程操作UI,所以我们吧VIew层和Modle层切开是非常合理的设计。而Presenter层必须通过接口定义才能实现
四、MVP实例
答:
- 实体类
/** * Created by Administrator on 2017/8/15. */public class User { private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; }}
- model层代码
/** * Created by Administrator on 2017/8/15. */public interface OnUserListener { void onSuccess(User user); void onError(String str);}
/** * Created by Administrator on 2017/8/15. */public interface UserBiz { public void login(String name,String age,OnUserListener listener);}
/**
* Created by Administrator on 2017/8/15.
*/
public class UserLogin implements UserBiz{
@Override
public void login(String name, String age, OnUserListener listener) {
//这里来处理登录的数据
Log.i("Text","2222222222222222222222"); User user = new User(); user.setAge("20"); user.setName("张三"); listener.onSuccess(user); listener.onError("失败了");}
}
- presenter层
/** * Created by Administrator on 2017/8/15. */public class LoginUserPresenter { private UserLogin userBiz; private IUserLoginView iUserLoginView; private Handler handler=new Handler(); private Context context; private User user ; public LoginUserPresenter(Activity activity,IUserLoginView iUserLoginView) { this.iUserLoginView = iUserLoginView; this.context = activity; userBiz = new UserLogin(); user = new User(); } public void Login(){ userBiz.login(iUserLoginView.getUsername(), iUserLoginView.getAge(), new OnUserListener() { @Override public void onSuccess(User user) { Log.i("TAG","333333333---"+user.getName()); iUserLoginView.toMainActivity(); } @Override public void onError(String str) { iUserLoginView.ShowErrow(); } }); } public void UserClear(){ iUserLoginView.clearUsername(); } public void AgeClear(){ iUserLoginView.clearAge(); }}
- View层
/** * Created by Administrator on 2017/8/15. */public interface IUserLoginView { String getUsername(); String getAge(); //清除用户和年龄 void clearUsername(); void clearAge(); //显示进度条和消除进度条 void ShowLoading(); void HideLoading(); //跳转到主界面 void toMainActivity(); //错误回调 void ShowErrow(); //下面还可以添加很多你自己需求的方法}
public class MainActivity extends AppCompatActivity implements IUserLoginView { private EditText username,userage; private Button bt_login,clear_username,clear_age; private LoginUserPresenter loginuserpersenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); loginuserpersenter= new LoginUserPresenter(MainActivity.this,this); init(); } private void init() { username = (EditText)findViewById(R.id.username); userage = (EditText)findViewById(R.id.userage); bt_login = (Button)findViewById(R.id.bt_login); clear_username = (Button)findViewById(R.id.clear_username); clear_username.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { loginuserpersenter.UserClear(); } }); clear_age = (Button)findViewById(R.id.clear_age); clear_age.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { loginuserpersenter.AgeClear(); } }); bt_login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { loginuserpersenter.Login(); } }); } @Override public String getUsername() { return username.getText().toString(); } @Override public String getAge() { return userage.getText().toString(); } @Override public void clearUsername() { username.setText(""); } @Override public void clearAge() { userage.setText(""); } @Override public void ShowLoading() { } @Override public void HideLoading() { } @Override public void toMainActivity() { Log.i("TAG","1111111111---成功跳转"); Toast.makeText(MainActivity.this,"11111111111111,跳转到主界面",Toast.LENGTH_SHORT).show(); } @Override public void ShowErrow() { Log.i("TAG","1111111111---失败跳转"); Toast.makeText(MainActivity.this,"22222222222222,,错误信息",Toast.LENGTH_SHORT).show(); }}
- 面试记录第二十节——(MVP讲解)
- 面试记录第二十五节——(线程池)
- 面试记录第八节——(listview面试)
- 面试体记录第四节——(handler)
- 面试记录第十二节——(Butterknife 注入框架)
- 面试记录第十四节——(什么是oom)
- 面试记录第十六节——(内存泄露)
- 面试记录第十七节——(内存管理机制概述)
- 面试记录第十九节——(MVC)
- 面试记录第二十二节——(lint检查)
- 面试记录第二十四节——(多线程)
- 第二十五天 面试总结
- 2009-02-21读书记录:《代码大全》(第一版)第二十章——编程工具
- 第二十天学习记录
- Scala入门到精通——第二十节 类型参数(二)
- Scala入门到精通——第二十节 类型参数(二)
- Mvp模式 通俗化讲解
- android mvp模式讲解
- 探讨margin-top的bug
- 常用的git命令
- arse Error at line 58 column 17: The content of element type "struts-config" must match "(display-na
- springmvc中如何配置控制台输出日志
- 第十一课 tensorflow RNN原理及解析
- 面试记录第二十节——(MVP讲解)
- 最新版管家婆辉煌版普及版II TOP+ V12.71单机、网络、门店破解
- C# 导出 Excel 和相关打印设置
- git 操作的一些方式
- 使用Apache的ab工具进行压力测试
- Communications link failure
- redis的持久化--快照持久化(SNAPSHOTTING)
- sort
- Android启动定时任务