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