MVP中关于契约的用法
契约类的好处:低耦合、接口统一管理、业务逻辑清晰、易于后期维护。
以最简单的登录为例:
#loginContract契约类
/**
* 契约类
*/
public interface LoginContract {
interface View extends BaseView<Presenter> {
void showSuccess();
void showFailed();
}
interface Presenter extends BasePresenter {
void login(String name, String psd);
}
}
持有presenter对象
public interface BaseView<T> {
void setPresenter(T presenter);
boolean isActive();
}
#做一些初始化的工作
public interface BasePresenter {
void start();
}
实现presenter
public class LoginPresenter extends BasePresenter<LoginContract.View> implements LoginContract.Presenter {
LoginContract.View mView;
public LoginPresenter(LoginContract.View mView) {
this.mView = mView;
this.mView.setPresenter(this);
}
@Override
public void login(String name, String psd) {
}
@Override
public void start() {
}
}
#Presenter实现类基类,用于回收对象,避免内存泄漏
/**
* Created by Administrator on 2017/4/25.
*/
public abstract class BasePresenter<V> {
protected Reference<V> mViewRef;
public static final LoginApi loginApi = ApiFactory.getLoginApiSingleton();
public void attachView(V view) {
mViewRef = new WeakReference<V>(view);
}
protected V getView() {
return mViewRef.get();
}
public boolean isViewAttached() {
return mViewRef != null && mViewRef.get() != null;
}
public void detachView() {
if (mViewRef != null) {
mViewRef.clear();
mViewRef = null;
}
}
}
在activity中使用
public class LoginActivity extends BaseActivity<LoginContract.View, LoginPresenter> implements LoginContract.View, View.OnClickListener {
@BindView(R.id.la_et_account)
EditText mLaEtAccount;
@BindView(R.id.la_et_psd)
EditText mLaEtPsd;
@BindView(R.id.la_btn_login)
Button mLaBtnLogin;
// 所需的全部权限
static final String[] PERMISSIONS = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION
};
private PermissionsChecker mPermissionsChecker;
private final int REQUEST_CODE = 1;
@Override
protected void initView() {
}
@Override
protected int providerContentViewId() {
return R.layout.activity_login;
}
@Override
protected void setAppTitle() {
}
@Override
protected LoginPresenter createPresenter() {
return new LoginPresenter(this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPermissionsChecker = new PermissionsChecker(this);
//进入对应的页面判断标记是否有更新在进行调用此方法
if (SharedPreferencesUtil.getBoolean(this, Constant.SAVE_IS_UPDATE, false)) {
UpdateManager.update(this);
}
}
@OnClick({R.id.la_btn_login})
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.la_btn_login:
// mPresenter.login();
startActivity(new Intent(this, MainActivity.class));
break;
default:
break;
}
}
@Override
protected void onResume() {
super.onResume();
// 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (mPermissionsChecker.lacksPermissions(PERMISSIONS)) {
startPermissionsActivity();
}
}
}
private void startPermissionsActivity() {
PermissionsActivity.startActivityForResult(this, REQUEST_CODE, PERMISSIONS);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//拒绝时,关闭页面,缺少主要权限无法运行
if (requestCode == REQUEST_CODE && resultCode == PermissionsActivity.PERMISSIONS_DENIED) {
finish();
}
}
@Override
public void showSuccess() {
}
@Override
public void showFailed() {
}
private LoginContract.Presenter mPresenter;
@Override
public void setPresenter(@NonNull LoginContract.Presenter presenter) {
mPresenter = checkNotNull(presenter);
}
@Override
public boolean isActive() {
return false;
}
checkNotNull(方法只是一个判空处理)