什么是MVP?
MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的,Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
先看看我的view是怎么封装的
public interface BaseView {
/**
* 显示没有网络
*/
void showNoNetworkView();
/**
* 显示网络超时
*/
void showTimeoutView();
/**
* 显示空数据
*/
void showEmptyView();
/**
* 显示错误页面
*/
void showErrorView();
/**
* 显示登陆页面
*/
void showLoginView();
/**
* 显示内容页面
*/
void showContentView();
}
再看一个简单的Presenter
/**
* 基本的控制器
*
* @param <V> 视图泛型
*/
public class BasePresenter< V extends BaseView> {
private V mView;
/**
* 绑定view,一般在初始化中调用该方法
*/
public void attachView(V view) {
this.mView = view;
}
/**
* 断开view,一般在onDestroy中调用
*/
public void detachView() {
this.mView = null;
}
/**
* 是否与View建立连接
* 每次调用业务请求的时候都要出先调用方法检查是否与View建立连接
*/
public boolean isViewAttached() {
return mView != null;
}
/**
* 获得View
* @return V
*/
public V getView() {
return mView;
}
}
最后的关键BaseActivity
/**
* 泛型参数结束
*
* @param <V> 视图类型
* @param <P> 控制器类型
*/
public abstract class BaseActivity<V extends BaseView,
P extends BasePresenter<V>> extends AppCompatActivity
implements BaseView, StateLayout.OnViewRefreshListener {
protected P mPresenter;
protected StateLayout mStateLayout;
protected Object getLayoutView(LayoutInflater inflater) {
return null;
}
protected abstract void onCreated(@Nullable Bundle savedInstanceState);
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater inflater = LayoutInflater.from(this);
Object view = getLayoutView(inflater);
if (view != null) {
if (view instanceof View) {
setContentView((View) view);
} else if (view instanceof Integer) {
setContentView((Integer) view);
}
} else {
ContentViewInject.inject(this);
}
mStateLayout = findViewById(R.id.stateLayout);
if (mStateLayout != null) {
mStateLayout.setRefreshListener(this);
}
mPresenter = instancePresenter();
if (mPresenter != null) {
mPresenter.attachView((V) this);
}
onCreated(savedInstanceState);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mPresenter != null) {
mPresenter.detachView();
}
}
protected P instancePresenter() {
try {
ParameterizedType pType = (ParameterizedType) this.getClass()
.getGenericSuperclass();
if (pType != null) {
Type[] types = pType.getActualTypeArguments();
if (types.length == 2) {
Class<P> pClass = (Class<P>) types[types.length - 1];
return pClass.newInstance();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public void showNoNetworkView() {
runOnUiThread(() -> {
if (mStateLayout == null) return;
mStateLayout.showNoNetworkView();
});
}
@Override
public void showTimeoutView() {
runOnUiThread(() -> {
if (mStateLayout == null) return;
mStateLayout.showTimeoutView();
});
}
@Override
public void showEmptyView() {
runOnUiThread(() -> {
if (mStateLayout == null) return;
mStateLayout.showEmptyView();
});
}
@Override
public void showErrorView() {
runOnUiThread(() -> {
if (mStateLayout == null) return;
mStateLayout.showErrorView();
});
}
@Override
public void showLoginView() {
runOnUiThread(() -> {
if (mStateLayout == null) return;
mStateLayout.showLoginView();
});
}
@Override
public void showContentView() {
runOnUiThread(() -> {
if (mStateLayout == null) return;
mStateLayout.showContentView();
});
}
}
最后看一个简单的使用
@ContentView(R.layout.a_login)
public class LoginActivity extends BaseActivity<LoginView, LoginPresenter>
implements LoginView {
private EditText mName;
private EditText mPwd;
@Override
protected void onCreated(@Nullable Bundle savedInstanceState) {
mName = findViewById(R.id.mName);
mPwd = findViewById(R.id.mPwd);
}
@Override
protected void attachBaseContext(Context newBase) {
LocaleManager instance = LocaleManager.getInstance();
Context context = instance.attachBaseContext(newBase);
super.attachBaseContext(context);
}
@Override
public String getUserName() {
return mName.getText().toString();
}
@Override
public String getPassword() {
return mPwd.getText().toString();
}
@Override
public void setUserNameError(String error) {
mName.setError(error);
}
@Override
public void setPasswordError(String error) {
mPwd.setError(error);
}
public void login(View view) {
mPresenter.login();
}
@Override
public void refreshClick() {
}
@Override
public void loginClick() {
}
}
public class LoginPresenter extends BasePresenter<LoginView> {
public void login() {
if (!isViewAttached()) {
return;
}
LoginView view = getView();
String userName = view.getUserName();
String password = view.getPassword();
}
}
public interface LoginView extends BaseView {
String getUserName();
String getPassword();
void setUserNameError(String error);
void setPasswordError(String error);
}
网友评论