//main中的布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="demo01.com.bawei.mvp.MainActivity"> <EditText android:id="@+id/et_name" android:hint="用户名" android:layout_width="match_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/et_pwd" android:hint="密码" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/bt_login" android:text="登录" android:onClick="onClick" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
//下面属于v层当中的为用户显示的界面
//mainactivity
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener,ViewInterface { private EditText et_name; private EditText et_pwd; private Button bt_login; private PresenterSx presenterSx; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); presenterSx = new PresenterSx(this); } private void initView() { et_name = (EditText) findViewById(R.id.et_name); et_pwd = (EditText) findViewById(R.id.et_pwd); bt_login = (Button) findViewById(R.id.bt_login); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.bt_login: presenterSx.getData(et_name.getText().toString(),et_pwd.getText().toString(),this); break; } } @Override public void onNameError() { et_name.setError("name"); } @Override public void onPwdError() { et_pwd.setError("pwd"); } @Override public void onLogin() { Toast.makeText(this, "跳转", Toast.LENGTH_SHORT).show(); } }//v层的接口
public interface ViewInterface { void onNameError(); void onPwdError(); void onLogin(); }
//M层用来处理逻辑代码
//首先定义一个接口
public interface ModelInterface { void Login(String name, String pwd, Context context,LofinFinishLisenter lisenter); }
//然后调用这个接口
public class ModelSx implements ModelInterface{ @Override public void Login(String name, String pwd, Context context, LofinFinishLisenter lisenter) { if(TextUtils.isEmpty(name)){ lisenter.NameError(); Toast.makeText(context, "用户名不能为空", Toast.LENGTH_SHORT).show(); return; } if(TextUtils.isEmpty(pwd)){ lisenter.PwdError(); Toast.makeText(context, "密码不能为空", Toast.LENGTH_SHORT).show(); return; } Toast.makeText(context, "登录成功", Toast.LENGTH_SHORT).show(); lisenter.LoginCheng(); } }
//定义一个接口用来处理方法回调
public interface LofinFinishLisenter { void NameError(); void PwdError(); void LoginCheng(); }//接下来是P层的接口public interface PresenterInterface { void getData(String name, String pwd, Context context); }
//调用接口
public class PresenterSx implements PresenterInterface,LofinFinishLisenter{ private ViewInterface viewInterface; private final ModelSx modelSx; public PresenterSx(ViewInterface viewInterface) { this.viewInterface = viewInterface; modelSx = new ModelSx(); } @Override public void getData(String name, String pwd, Context context) { modelSx.Login(name,pwd,context,this); } @Override public void NameError() { viewInterface.onNameError(); } @Override public void PwdError() { viewInterface.onPwdError(); } @Override public void LoginCheng() { viewInterface.onLogin(); } }
//当然我们在做MVP模式的小demo的时候 MVP有它的优点 也有相对应的缺点
但是我们得了解什么是MVP
MVP模式: 之所以会出现MVP这种架构模式,是因为我相信大家在开发App时,肯定会发现,Activity的负担非常重,既要初始化控件,又要写一些逻辑操作的展示等等,有时候很多Activity中的代码都充当了Controller和Model的角色,所以你会发现Activity违背单一职责原则,负担过重。所以,就出现了这么一种架构模式,叫MVP MVP就是Model-View-Presenter,MVP是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示,及View。所以,在MVC模型里,Model不依赖于View,但是View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的
优点:利于维护 易于测试 松耦合 复用性高 易于扩展
缺点:由于presenter中经常进行一些耗时操作 如请求操作 但是 presenter持有了Activity的强引用 如果在请求结束之前 Activity被销毁 那么会导致presenter一直持有Activity的引用 使得Activity无法被回收 而发生内存泄漏 解决方法 : 通过弱引用和Activity Fragment的生命周期来解决