为什么要进行MVP的二次深入封装?
这里我是参看了:《如何更高效的使用MVP以及官方MVP架构解析》,通过上面的学习弄了个登录的demo,用于方便理解。
先来看看项目的文件
BasePresenter 如果每一个Activity都需要做绑定和解绑操作就太麻烦了,现在我希望可以有一个通用的presenter来为我们添加view的绑定与销毁。
public abstract class BasePresenter<T> { public T mView; public void attach(T view) { this.mView = view; } public void dettach() { mView = null; } } 因为不能限定死传入的View,所以使用泛型来代替传入的对象。通过这个通用的presenter我就可以把 LoginPresenter 简化成下面的样子。(Presenter主要进行业务逻辑,事件监听的处理,起(M层) biz 与 (V层) activity之间的桥梁连接作用)public class LoginPresenter extends BasePresenter<ILoginView> { private final LoginBiziml loginBiziml; private final Handler handler; public LoginPresenter() { loginBiziml = new LoginBiziml(); handler = new Handler(); } public void toDoLogin() { String userName = mView.getUserName(); String passWord = mView.getPassWord(); if (TextUtils.isEmpty(userName)) { mView.showErrorMsg("用户名不能为空"); return; } if (TextUtils.isEmpty(passWord)) { mView.showErrorMsg("密码不能为空"); return; } mView.showLoading(); User user = new User(); user.userName = userName; user.passWord = passWord; loginBiziml.loginApp(user, new OnLoginBizListener() { @Override public void onLoginSuccess(boolean isSuccess) { handler.post(new Runnable() { @Override public void run() { mView.hiddenLoading(); mView.showSuccessMsg("登录成功"); } }); } @Override public void onLoginFailed(boolean isSuccess) { handler.post(new Runnable() { @Override public void run() { mView.hiddenLoading(); mView.showErrorMsg("登录失败"); } }); } }); } public void clear() { mView.clearText(); } }BaseView 界面需要提供的UI方法中会有很多类似的UI方法,可以把它们提取到一个公共的父类接口中。比如提取显示loading界面和隐藏loading界面的方法等等,其他的view层接口就可以直接继承BaseView接口,不必重复的写显示和隐藏loading界面方法。 public interface BaseView { void showLoading(); void hiddenLoading(); void showSuccessMsg(String msg); void showErrorMsg(String msg); } BaseActivity presenter绑定到activity和View的绑定和解绑操作是每个Activity都会去做的,同样这里我也希望能有一个父类来完成这个统一的操作。 public abstract class BaseActivity<V,T extends BasePresenter<V>> extends AppCompatActivity { public T presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); presenter = initPresenter(); } @Override protected void onResume() { super.onResume(); presenter.attach((V) this); } @Override protected void onDestroy() { presenter.dettach(); super.onDestroy(); } public abstract T initPresenter(); } 同样使用泛型来提取通用的逻辑,presenter的初始化,以及view的绑定和解绑操作都提取到父类Activity中。向外部提供了一个 initPresenter(); 方法用来初始化presenter,如果想创建不同参数的构造函数都可以随意去创建。
LoginActivity(我这里写demo时直接用MainActivity)
public class MainActivity extends BaseActivity<ILoginView, LoginPresenter> implements ILoginView { private EditText mEtUsername, mEtPassword; private Button mBtnLogin, mBtnClear; private ProgressBar mPbLoading; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initview(); } private void initview() { mEtUsername = (EditText) findViewById(R.id.id_et_username); mEtPassword = (EditText) findViewById(R.id.id_et_password); mBtnClear = (Button) findViewById(R.id.id_btn_clear); mBtnLogin = (Button) findViewById(R.id.id_btn_login); mPbLoading = (ProgressBar) findViewById(R.id.id_pb_loading); mBtnLogin.setOnClickListener(new View.OnClickListener() { private User user; @Override public void onClick(View v) { presenter.toDoLogin(); } }); mBtnClear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { presenter.clear(); } }); } @Override public LoginPresenter initPresenter() { return new LoginPresenter(); } @Override public void toMain() { } @Override public void clearText() { mEtUsername.setText(null); mEtPassword.setText(null); } @Override public String getUserName() { return mEtUsername.getText().toString().trim(); } @Override public String getPassWord() { return mEtPassword.getText().toString().trim(); } @Override public void showLoading() { mPbLoading.setVisibility(View.VISIBLE); } @Override public void hiddenLoading() { mPbLoading.setVisibility(View.GONE); } @Override public void showSuccessMsg(String msg) { Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } @Override public void showErrorMsg(String msg) { Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } } activity中只做了控件的初始化和展示,有没有代码很简洁感觉,赶紧动手敲敲吧。Demo