浅谈Android MVP 设计模式

历览千载书,时时见遗烈。这篇文章主要讲述浅谈Android MVP 设计模式相关的知识,希望能为你提供帮助。
为什么需要MVP
关于什么是MVP,以及MVC、MVP、MVVM有什么区别,这类问题网上已经有很多的讲解,你可以自行搜索或看看文末的参考文章,这里就只讲讲为什么需要MVP。 
在Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,并接受并处理来自用户的操作请求,进而作出响应。但是,随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致很容易变得庞大而臃肿。 
越小的类,bug越不容易出现,越容易调试,更容易测试,我相信这一点大家是都赞同的。在MVP模式下,View和Model是完全分离没有任何直接关联的(比如你在View层中完全不需要导Model的包,也不应该去关联它们)。 
使用MVP模式能够更方便的帮助Activity(或Fragment)职责分离,减小类体积,使项目结构更加清晰。
MVC和MVP到底有什么区别呢?
 

浅谈Android MVP 设计模式

文章图片

 
浅谈Android MVP 设计模式

文章图片

 
从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。
androidMVP使用示例首先需要定义一个View层接口,让View实现类Activity(Fragment)实现; 
其次需要定义一个Presenter实现接口,让Presenter实现类实现; 
在View实现类Activity(Fragment)中包含Presenter对象,并在Presenter创建的时候传一个View对象;
在Presenter中通过构造时传入的视图层对象操作View
从M开始
UserModel.Class
public class UserModel { public ILoginPresenter mILoginPresenter; public UserModel(ILoginPresenter presenter) { this.mILoginPresenter = presenter; }public void getServerLogon(String username, String password){ int state=0; mILoginPresenter.responeLogin(state); }}

接下来是V
ILoginView.Class
public interface ILoginView { void loginSuccess(int state); }

LoginActivity.Class
public class LoginActivity extends AppCompatActivity implements ILoginView, View.OnClickListener {private EditText usernameEdit, passwrodEdit; private Button loginButton; private LoginPersenter loginPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mvplogin); usernameEdit = (EditText) findViewById(R.id.et_username); passwrodEdit = (EditText) findViewById(R.id.et_username); loginButton = (Button) findViewById(R.id.bt_login); loginButton.setOnClickListener(this); loginPresenter = new LoginPersenter(this); }@Override public void loginSuccess(int state) { Toast.makeText(this, "login success", Toast.LENGTH_SHORT).show(); }@Override public void onClick(View v) { switch (v.getId()) { case R.id.bt_login: loginPresenter.requestLogin(usernameEdit.getText().toString(), passwrodEdit.getText().toString()); break; } } }

最后就是P了
ILoginPresenter.Class
public interface ILoginPresenter { void responeLogin(int state); }

LoginPresenter.Class
public class LoginPersenter implements ILoginPresenter { public UserModel mUserModel; public ILoginView mILoginView; public LoginPersenter(ILoginView view) { mILoginView=view; mUserModel = new UserModel(this); }public void requestLogin(String username, String password){ mUserModel.getServerLogon(username,password); }@Override public void responeLogin(int state) { mILoginView.loginSuccess(state); }}

Android MVP存在的问题1.在实际开发当中,由于团队之间很难做到密切配合,所以view往往是很难服用的。不用强求复用View

2. 例如当应用进入后台且内存不足的时候,系统是会回收这个Activity的。通常我们都知道要用OnSaveInstanceState()去保存状态,用OnRestoreInstanceState()去恢复状态。 在生命周期处理好Persenter的相关判断。

3.Persenter不参与Android生命周期处理起来会简单一些。
 
【浅谈Android MVP 设计模式】
浅谈Android MVP 设计模式

文章图片


    推荐阅读