Android's MVP设计模式
来源:互联网 发布:竞猜单关历史开奖数据 编辑:程序博客网 时间:2024/06/02 06:07
MVP的概念
MVP是MVC的变种,本质是对MVP设计模式的一种升级。在MVC中Activity即是View也是Controller,耦合度极高,非常不利于项目的管理。这时候MVP就应运而生了。MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类还是原来的Model。 在MVP模式中Activity的功能就是响应生命周期和显示界面,具体其他的工作都丢到了Presenter层中进行完成,Presenter其实是Model层和View层的桥梁。也方便单元测试
MVP设计模式的Demo
Model层
//Model层,用于暂时存储数据public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
View层
//View层的接口,用于处理ui的更新public interface ILoginView { public void onClearText(); public void onLoginResult(Boolean result,int code);}
public class MainActivity extends AppCompatActivity implements ILoginView, View.OnClickListener { private EditText mName; private EditText mPassWord; private Button mLogin; private Button mClear; private ILoginPresenter loginPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { mName = (EditText) findViewById(et_name); mPassWord = (EditText) findViewById(et_password); mLogin = (Button) findViewById(R.id.btn_login); mClear = (Button) findViewById(R.id.btn_clear); mLogin.setOnClickListener(this); mClear.setOnClickListener(this); //将activity作为接口传入 //注意处理内存泄漏,在特定时机将present置空 loginPresenter = new LoginPresenterCompl(this); } //实现ui更新的两个方法 @Override public void onClearText() { mName.setText(""); mPassWord.setText(""); Toast.makeText(this, "clear", Toast.LENGTH_SHORT).show(); } @Override public void onLoginResult(Boolean result, int code) { mLogin.setEnabled(true); mClear.setEnabled(true); if (result) { Toast.makeText(this, "登陆成功: " + code, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "登陆失败:" + code, Toast.LENGTH_SHORT).show(); } } //将逻辑处理交由P层处理 @Override public void onClick(View v) { int id = v.getId(); String name = mName.getText().toString(); String password = mPassWord.getText().toString(); switch (id) { case R.id.btn_login: loginPresenter.doLogin(name, password); break; case R.id.btn_clear: loginPresenter.clear(); break; } }}
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/et_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_marginTop="94dp" android:ems="10" android:hint="name" android:inputType="textPersonName"/> <EditText android:id="@+id/et_password" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_below="@+id/et_name" android:ems="10" android:hint="password" android:inputType="textPassword"/> <Button android:id="@+id/btn_login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_centerVertical="true" android:text="LOGIN"/> <Button android:id="@+id/btn_clear" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/btn_login" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:text="CLEAR"/></RelativeLayout>
Presenter层
//presenter的接口,用于处理逻辑public interface ILoginPresenter { public void clear(); public void doLogin(String name,String password);}
//实现了p层接口,实现了逻辑操作public class LoginPresenterCompl implements ILoginPresenter { private ILoginView loginView; private User user; //在构造器中需要将view层作为接口传入 public LoginPresenterCompl(ILoginView view) { loginView = view; user=new User(); user.setName("zhangsan"); user.setPassword("123456"); } @Override public void clear() { loginView.onClearText(); } @Override public void doLogin(String name, String password) { boolean result = false; int code = 0; if (name.equals(user.getName()) && password.equals(user.getPassword())) { result = true; code = 1; } else { result = false; code = 0; } loginView.onLoginResult(result, code); }}
处理MVP模式造成的泄漏
由于Present和View相互持有对象,所以内存泄漏了
处理方法:在特定的时候将view中的P层置空,那么GC就可以将他们回收了 //处理内存泄漏 @Override protected void onDestroy() { super.onDestroy(); loginPresenter=null; }
也可以,在其中一个环节使用软引用.但这样做在内存不足时候有一定的风险;
阅读全文
0 0
- Android's MVP设计模式
- Android MVP 设计模式
- Android: MVP设计模式
- Android MVP 设计模式
- android MVP设计模式实践
- Android的MVP设计模式
- Android中的MVP设计模式
- Android之mvp设计模式
- 关于Android MVP设计模式
- Android MVP设计模式浅析
- Android之MVP设计模式
- Android,谈谈MVP设计模式
- Android mvp模式设计讨论
- Android设计模式之MVP
- Android之MVP设计模式
- Android设计模式之MVP
- Android 初识mvp设计模式
- Android的设计模式MVP
- Android双卡识别IMSI以及副卡发送短信总结
- 厉害了!教你如何在手机连上WiFi时仍然使用移动网络
- 基于Walle的多渠道快速打包自动脚本
- 自己实现一款安卓日历
- 加快Gradle的构建速度
- Android's MVP设计模式
- 类似于京东的地址选择器
- 开源一个后台基于bmob云端的社交app
- Java服务器接口快速开发之Servlet详细教程
- Android侧滑粘稠效果的实现
- Android中常用的4中线程池
- 可展开和收起的LinearLayout
- Android倒计时控件实现
- ConstraintLayout属性详解和Chain的使用