Android中MVP模式的创建P的注解工厂,代理模式绑定和V的生命周期以恢复数据(四)

来源:互联网 发布:常州seo排名公司 编辑:程序博客网 时间:2024/06/06 16:26

在经历上一篇抽象出了许多base类后,绑定解绑中断等冗余代码被优化掉了,但是MainActivity中还需要手动创建P(createPresenter())。所以这篇文章就用注解和代理优化掉这个步骤。在实现完后,效果是这样的


只需要一个直接就把工厂给创建了。


先看一下P工厂接口

public interface PresentFactory<V extends BaseRequestView, P extends BaseRequestPresenter<V>> {    P createPresenter();}

再看一下自定义的注解

@Inherited@Retention(RetentionPolicy.RUNTIME)public @interface CreatePresenter {    Class<? extends BaseRequestPresenter> value();}
@Retention(RetentionPolicy.RUNTIME)这个注解是运行时注解,只有在标注这样一个注解之后,我们才可以用反射的方式来处理我们这个自定义的注解

@Inherited与上面那个注解配合使用,为了让反射代码检查展开工作


P工厂的实现类

看一下这个方法

public static <V extends BaseRequestView, P extends BaseRequestPresenter<V>>    PresenterFactoryImpl<V, P> createFactory(Class<?> viewClazz) {    CreatePresenter annotation = viewClazz.getAnnotation(CreatePresenter.class);    Class<P> aClass = null;    if (annotation != null) {        aClass = (Class<P>) annotation.value();    }    return aClass == null ? null : new PresenterFactoryImpl<>(aClass);}
这就是创建工厂的方法了,通过取得注解中标注的类名@CreatePresenter(RequestPresenter.class),其中annotation.value()就是这个Class对象RequestPresenter.class了。获取了这个类对象以后,就返回一个新的工厂实现类,并且把获取的这个Class对象作为构造方法传进去。


创建P的方法

@Overridepublic P createPresenter() {    try {        return mPresentClass.newInstance();    } catch (InstantiationException | IllegalAccessException e) {        e.printStackTrace();        throw new RuntimeException("Presenter创建失败,检查注解声明");    }}
当你Class对象传进来以后,并且被维护成成员变量mPresentClass了,这个时候你就可以通过newInstance()来创建这个对象的实例了。


上面的流程就是通过注解+反射的机制获取了类名,再通过newInstance来创建了对象。


因为我们还要考虑mvp在fragment上的使用和我们不仅仅满足于createPresenter()和createFactory()方法,所以我们还采用了静态代理。


代理的接口,表明了代理者必须要成设置工厂,取得工厂和取得P的任务

public interface PresentProxyInterface<V extends BaseRequestView,        P extends BaseRequestPresenter<V>> {    void setPresenterFactory(PresentFactory<V, P> presentFactory);    PresentFactory<V, P> getPresenterFactory();    P getPresenter();}

代理类

设置工厂(默认可以不设置,如果满足不了需求可以设置)

@Overridepublic void setPresenterFactory(PresentFactory<V, P> presentFactory) {    if (mPresenter != null) {        throw new IllegalArgumentException("---");    }    this.mFactory = presentFactory;}

取得工厂

@Overridepublic PresentFactory<V, P> getPresenterFactory() {    return mFactory;}

取得P

@Overridepublic P getPresenter() {    if (mFactory != null) {        if (mPresenter == null) {            mPresenter = mFactory.createPresenter();        }    }    return mPresenter;}

扩展方法(一系列生命周期方法用于和activity同步,完成数据恢复,如果有界面以外销毁的情况,我们进行一些数据的保存,清理和恢复)

public void onResume(V mV) {    getPresenter();    if (mPresenter != null && !mIsAttachedView) {        mPresenter.onAttachView(mV);        mIsAttachedView = true;    }}

public void onDetachView() {    if (mPresenter != null && mIsAttachedView) {        mPresenter.onDetachView();        mIsAttachedView = false;    }}

public void onDestory() {    if (mPresenter != null) {        onDetachView();        mPresenter.onDestoryPresenter();        mPresenter = null;    }}

public Bundle onSaveInstance() {    Bundle bundle = new Bundle();    getPresenter();    if (mPresenter != null) {        Bundle presenterBundle = new Bundle();        mPresenter.onSaveInstanceState(presenterBundle);        bundle.putBundle(PRESENT_KEY, presenterBundle);    }    return bundle;}

public void onRestoreInstanceState(Bundle savedInstance) {    mBundle = savedInstance;}

baseV中,现在不是直接对P层操作了,而是对在P层基础上扩容了功能的代理类操作

package com.example.mvp.base_mvp;import android.os.Bundle;import android.support.annotation.Nullable;import com.example.mvp.base.BaseActivity;import com.example.mvp.factory.BaseProxy;import com.example.mvp.factory.PresentFactory;import com.example.mvp.factory.PresentProxyInterface;import com.example.mvp.factory.PresenterFactoryImpl;public abstract class BaseRequestActivity<V extends BaseRequestView, P extends BaseRequestPresenter<V>>    extends BaseActivity implements PresentProxyInterface<V, P> {    private static final String PRESENT_SAVE_KEY ="presenter_save_key";    private BaseProxy<V, P> mProxy = new BaseProxy<>(PresenterFactoryImpl.<V,P>createFactory(getClass()));    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        if (savedInstanceState != null) {            mProxy.onRestoreInstanceState(savedInstanceState.getBundle(PRESENT_SAVE_KEY));        }    }    @Override    protected void onResume() {        super.onResume();        mProxy.onResume((V)this);    }    @Override    protected void onDestroy() {        super.onDestroy();        mProxy.onDestory();    }    @Override    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        outState.putBundle(PRESENT_SAVE_KEY, mProxy.onSaveInstance());    }    @Override    public void setPresenterFactory(PresentFactory<V, P> presentFactory) {        mProxy.setPresenterFactory(presentFactory);    }    @Override    public PresentFactory<V, P> getPresenterFactory() {        return mProxy.getPresenterFactory();    }    @Override    public P getPresenter() {        return mProxy.getPresenter();    }}

所以现在的activity中终于把所有东西的“优化”掉了

@CreatePresenter(RequestPresenter.class)public class MainActivity extends BaseRequestActivity<RequestView,        RequestPresenter> implements RequestView {    @BindView(R.id.textView)    TextView mTextView;    @BindView(R.id.button)    Button mButton;    @Override    protected int getContentView() {        return R.layout.activity_main;    }    @OnClick(R.id.button)    public void onClick(View v) {        switch (v.getId()) {            case R.id.button:                getPresenter().clickRequest("136284008", "xbh");                break;        }    }    private ProgressDialog dialog;    @Override    public void requestLoading() {        dialog = ProgressDialog.show(this, "提示", "正在登陆中", false, true, new DialogInterface.OnCancelListener() {            @Override            public void onCancel(DialogInterface dialog) {                getPresenter().interrupt();            }        });    }    @Override    public void resultSuccess(JSONObject object) {        mTextView.setText(object.toString());    }    @Override    public void resultFailure(String errorMsg) {        mTextView.setText(errorMsg);    }    @Override    public void resultFinish() {        dialog.cancel();    }    @Override    protected void onDestroy() {        super.onDestroy();        getPresenter().interrupt();    }}

后面可能还会用Databing和rxjava优化

github地址:https://github.com/xubinhong/MVP2

原创粉丝点击