MVP:Model,View和Presenter
作用:分离VIew和Model,通过接口实现VIew和Presenter的交互,有利于单元测试,同时较少Activity的代码,Presenter分担原来在Activity实现的逻辑代码。
代码实现:
1,定义IView和IPresenter
public interface IView {
Activity getActivity();
}
public interface IPresenter {
void detachView();
}
2,定义BaseView(BaseActivity和BaseFragment)和BasePresenter,分别集成IView和IPresenter
public abstract class BaseView
extends Activity implements IView {
protected P prosenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
prosenter = bindPresenter();
}
protected abstract P bindPresenter();
@Override
public Activity getActivity() {
return this;
}
@Override
protected void onDestroy() {
super.onDestroy();
if (prosenter != null) prosenter.detachView();
}
}
public class BasePresenter implements IPresenter {
protected Reference MvpView;
public BasePresenter(V view) {
MvpView = new WeakReference<>(view);
}
protected V getView() {
if (MvpView != null) {
return MvpView.get();
}
return null;
}
protected boolean isAttach() {
return MvpView != null && MvpView.get() != null;
}
@Override
public void detachView() {
if (MvpView != null) {
MvpView.clear();
MvpView = null;
}
}
}
3,MainActivity和MainPresenter开始使用,在使用之前先创建MainContacts类来管理MVP
public class MainContact {
public interface ILogMode {
void login(String name, String pwd, IModelResultListenet backListenet);
}
public interface ILogView extends IView {
void success(boolean isSuccess);
}
public interface ILogPresenter extends IPresenter{
void login(String name, String pwd);
}
}
public class MainActivity extends BaseView implements MainContact.ILogView {
@Override
public void success(boolean isSuccess) {
}
@Override
protected MainPresenter bindPresenter() {
return new MainPresenter(this);
}
void init() {
prosenter.login("", "");
}
}
public class MainPresenter extends BasePresenter implements MainContact.ILogPresenter {
LogModel mLogModel;
public MainPresenter(MainContact.ILogView view) {
super(view);
mLogModel = new LogModel();
}
@Override
public void login(String name, String pwd) {
if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(pwd)) {
mLogModel.login(name, pwd, new IModelResultListenet() {
@Override
public void onSuccess(String o) {
getView().success(true);
}
@Override
public void onFailure() {
getView().success(false);
}
});
} else {
}
}
}
public class LogModel implements MainContact.ILogMode {
@Override
public void login(String name, String pwd, IModelResultListenet backListenet) {
if (name.equals(pwd)) {
backListenet.onSuccess(null);
} else {
backListenet.onFailure();
}
}
}
//Model回调
public interface IModelResultListenet {
void onSuccess(T t);
void onFailure();
}
就这样一个MVP就体现出来了