资料
MVP模式的经典封装
自己封装的思路
首先是各种基础的接口,一般提供通用方法。
IMode
public interface IMode {
void load();
}
IView
public interface IView {
void onSuccess(Object...objects);
void onError();
}
IPresenter
public interface IPresenter{
void detachView();
}
然后是针对View的二次封装
public interface BaseView extends IView {
void initView();
void initButton();
void initData();
void showProgress();
void dismissProgress();
}
然后是Presenter的二次封装
public abstract class BasePresenter<V extends IView,M extends IMode> implements IPresenter {
protected M mode;
protected WeakReference<V> weakReference;
public void attachView(V iView) {
weakReference = new WeakReference<>(iView);
}
public BasePresenter(V v) {
attachView(v);
}
public V getView() {
if (weakReference != null)
return weakReference.get();
else return null;
}
@Override
public void detachView() {
if (weakReference != null) {
weakReference.clear();
weakReference = null;
}
}
public boolean isViewAttach() {
return weakReference != null && weakReference.get() != null;
}
}
然后是Activity的基类的封装
- 其实可以更丰富的,比如点击事件的控制,返回键的控制等等。
public abstract class NewBaseActivity<P extends BasePresenter> extends AppCompatActivity implements BaseView{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter = createPresenter();
initData();
initView();
initButton();
}
protected P presenter;
protected abstract P createPresenter();
@Override
public void initView() {
}
@Override
public void initButton() {
}
@Override
public void initData() {
}
@Override
public void showProgress() {
//...展示弹窗
}
@Override
public void dismissProgress() {
//...隐藏
}
}
基础打好了,现在看是在业务中使用了。
首先是UsbContract类
- 这个类是放接口的地方,主要是接口集中,方便查看代码和业务。方便查看接口都有那些,干了什么。
public class UsbContract {
//这个用来调用业务逻辑后回调给View层
interface UsbView extends BaseView{
void connectSuccess();
void connectFail();
}
//这个是Mode层方法的接口类
interface UsbMode extends IMode{
void connect(Callback callback);
}
//这个是业务层完成后回调到presenter层
public interface Callback{
void onSuccess();
void onError();
void onInterrupt();
void onComplete();
}
}
业务层UsbMode
public class UsbMode implements UsbContract.UsbMode{
@Override
public void load() {
}
@Override
public void connect(UsbContract.Callback callback) {
try{
callback.onSuccess();
}catch (Exception e){
e.printStackTrace();
}finally {
callback.onComplete();
}
}
}
中间层UsbPresenter
public class UsbPresenter extends BasePresenter<UsbContract.UsbView,UsbContract.UsbMode> implements IPresenter {
public UsbPresenter(UsbContract.UsbView usbView) {
super(usbView);
mode = new UsbMode();
}
void connect(){
getView().showProgress();
mode.connect(new UsbContract.Callback() {
@Override
public void onSuccess() {
getView().onSuccess("成功了",1);
}
@Override
public void onError() {
getView().onError();
}
@Override
public void onInterrupt() {
getView().onError();
}
@Override
public void onComplete() {
getView().dismissProgress();
}
});
}
}
View层
public class UsbActivity extends NewBaseActivity<UsbPresenter> implements UsbContract.UsbView {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter.connect();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (presenter != null)
presenter.detachView();
}
@Override
protected UsbPresenter createPresenter() {
return new UsbPresenter(this);
}
@Override
public void onSuccess(Object... objects) {
}
@Override
public void onError() {
}
@Override
public void connectSuccess() {
}
@Override
public void connectFail() {
}
}
完了
- 整个过程就是在view中实例化Presenter,需要传入View的对象,同时会实例化Mode。
- Presenter同时持有View和Mode的引用,然后通过套娃回调来通知请求结果。
网友评论