Skip to content

根据鸿洋大神提供的wanandroid api,编写一个属于自己wanandorid项目(java版)

Notifications You must be signed in to change notification settings

zziafyc/WanAndroid_java

Repository files navigation

WanAndroid_java

根据鸿洋大神提供的wanandroid api,编写一个属于自己wanandorid项目(java版),更多版本请看https://github.com/zziafyc

项目通过使用注解、工厂模式、代理模式、策略模式等,整体上解决代码冗余、内存泄露、Presenter生命周期以及数据存储问题,也是对mvp模式的高级抽象封装,喜欢mvp架构的小伙伴可以参考下(整个架构参考了 刘镓旗的perfect-mvp)。

1、将presenter通过注解的方式引入


/**
 * @作者 zziafyc
 * @创建日期 2019/7/28
 * @description 标注创建Presenter的注解
 */
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface CreatePresenter {
    Class<? extends BasePresenter> value();
}

2.通过工厂模式创建IPresenterFactory接口

/**
 * @作者 zziafyc
 * @创建日期 2019/7/28
 * @description 创建present的工厂接口
 */
public interface IPresenterFactory<V extends BaseView, P extends BasePresenter<V>> {

    /**
     * 创建Presenter
     *
     * @return presenter
     */
    P createPresenter();
}

3.创建present的工厂接口的实现类PresenterFactoryImpl

public class PresenterFactoryImpl<V extends BaseView, P extends BasePresenter<V>> implements IPresenterFactory<V, P> {
    /**
     * 需要创建的Presenter的类型
     */
    private final Class<P> mPresenterClass;

    public PresenterFactoryImpl(Class<P> presenterClass) {
        this.mPresenterClass = presenterClass;
    }

    @Override
    public P createPresenter() {
        try {
            return mPresenterClass.newInstance();
        } catch (Exception e) {
            throw new RuntimeException("Presenter create failed!," +
                    "please check if declaration @CreatePresenter(xxx.class) anotation or not");
        }
    }

    /**
     * 根据注解创建Presenter的工厂实现类
     *
     * @param clazz 需要创建Presenter的V层实现类
     * @param <V>   当前View实现的接口类型
     * @param <P>   当前要创建的Presenter类型
     * @return 工厂类
     */
    public static <V extends BaseView, P extends BasePresenter<V>> PresenterFactoryImpl<V, P> createFactory(Class<?> clazz) {
        CreatePresenter annotation = clazz.getAnnotation(CreatePresenter.class);
        Class<P> aClass = null;
        if (annotation != null) {
            aClass = (Class<P>) annotation.value();
        }
        return aClass == null ? null : new PresenterFactoryImpl<>(aClass);
    }
}

4.通过代理模式,创建presenter的代理接口IPresenterProxy

public interface IPresenterProxy<V extends BaseView, P extends BasePresenter<V>> {
    /**
     * 设置创建presenter的工厂
     *
     * @param presenterFactory 工厂类型
     */

    void setPresenterFactory(IPresenterFactory<V, P> presenterFactory);

    /**
     * 获取presenter的工厂类
     *
     * @return IPresenterFactory
     */

    IPresenterFactory<V, P> getPresenterFactory();

    /**
     * 获取创建的presenter
     *
     * @return 指定类型的presenter
     */

    P getPresenter();

}

5.创建代理接口IPresenterProxy的实现类PresenterProxyImpl

public class PresenterProxyImpl<V extends BaseView, P extends BasePresenter<V>> implements IPresenterProxy<V, P> {
    /**
     * 获取onSaveInstanceState中bundle的key
     */
    private static final String PRESENTER_KEY = "presenter_key";
    private P mPresenter;
    private Bundle mBundle;
    private boolean mIsBindView;

    private IPresenterFactory<V, P> mFactory;

    public PresenterProxyImpl(IPresenterFactory<V, P> factory) {
        this.mFactory = factory;
    }

    @Override
    public void setPresenterFactory(IPresenterFactory<V, P> presenterFactory) {
        if (mPresenter != null) {
            throw new IllegalArgumentException("这个方法只能在getPresenter()之前调用,如果Presenter已经创建则不能再修改");
        }
        this.mFactory = presenterFactory;
    }

    @Override
    public IPresenterFactory<V, P> getPresenterFactory() {
        return mFactory;
    }

    /**
     * 获取创建的Presenter
     *
     * @return 指定类型的Presenter
     * 如果之前创建过,而且是以外销毁则从Bundle中恢复
     */
    @Override
    public P getPresenter() {
        if (mFactory != null) {
            if (mPresenter == null) {
                mPresenter = mFactory.createPresenter();
                mPresenter.onCreatePresenterBundle(mBundle);
            }
        }
        return mPresenter;
    }

    /**
     * 绑定presenter和view
     *
     * @param view
     */
    public void onCreate(V view) {
        getPresenter();
        if (mPresenter != null && !mIsBindView && view != null) {
            mPresenter.onBindView(view);
            mIsBindView = true;
        }
    }

    /**
     * 销毁presenter创建的view
     */
    public void onUnbindView() {
        if (mPresenter != null && mIsBindView) {
            mPresenter.onUnBindView();

        }
    }

    /**
     * 销毁presenter
     */
    public void onDestroy() {
        if (mPresenter != null) {
            onUnbindView();
            mPresenter.OnDestroyPresenter();
            mPresenter = null;

        }
    }

    /**
     * 意外销毁的时候调用,存入回调给Presenter的Bundle和当前Presenter的id
     *
     * @return
     */
    public Bundle onSaveInstanceState() {
        Bundle bundle = new Bundle();
        getPresenter();
        if (mPresenter != null) {
            Bundle presenterBundle = new Bundle();
            mPresenter.onSaveInstanceState(presenterBundle);
            bundle.putBundle(PRESENTER_KEY, presenterBundle);
        }
        return bundle;
    }

    /**
     * 意外关闭恢复Presenter
     *
     * @param savedInstanceState 意外关闭时存储的Bundler
     */
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        mBundle = savedInstanceState;
    }
}

6.封装BaseAcitivity

public abstract class BaseActivity<V extends BaseView, P extends BasePresenter<V>> extends AppCompatActivity
        implements IPresenterProxy<V, P>, BaseViewInterface {
    private static final String PRESENTER_SAVE_KEY = "presenter_save_key";
    private String TAG = this.getClass().getName();
    private PresenterProxyImpl<V, P> mPresenterProxy = new PresenterProxyImpl<>
            (PresenterFactoryImpl.<V, P>createFactory(getClass()));
    private Unbinder mUnbinder;

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBundle(PRESENTER_SAVE_KEY, mPresenterProxy.onSaveInstanceState());
    }


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            mPresenterProxy.onRestoreInstanceState(savedInstanceState.getBundle(PRESENTER_SAVE_KEY));
        }
        if (getLayoutId() != 0) {
            setContentView(getLayoutId());
        }
        mPresenterProxy.onCreate((V) this);
        mUnbinder = ButterKnife.bind(this);
        initView();
        initData(savedInstanceState);
    }


    @Override
    public void setPresenterFactory(IPresenterFactory<V, P> presenterFactory) {
        mPresenterProxy.setPresenterFactory(presenterFactory);

    }

    @Override
    public IPresenterFactory<V, P> getPresenterFactory() {
        return mPresenterProxy.getPresenterFactory();
    }

    @Override
    public P getPresenter() {
        return mPresenterProxy.getPresenter();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPresenterProxy.onDestroy();
        mUnbinder.unbind();
    }

}

7.封装BaseView和BaseViewInterface

public interface BaseView {

}

public interface BaseViewInterface {
    /**
     * get布局id
     *
     * @return
     */
    int getLayoutId();

    /**
     * 初始化布局
     *
     * @return
     */
    void initView();

    /**
     * 初始化数据
     */

    void initData(@Nullable Bundle savedInstanceState);
}

8.封装BasePresenter

public abstract class BasePresenter<V extends BaseView> {
    private V baseView;
    private String TAG = this.getClass().getName();
    public ApiUtils mApiUtils;

    /**
     * presenter初始化
     */
    public BasePresenter() {
        mApiUtils = ApiFactory.getApiUtil();
    }

    /**
     * Presenter创建的时候使用
     *
     * @param savedState 被意外销毁后重建后的Bundle
     */
    public void onCreatePresenterBundle(@Nullable Bundle savedState) {
    }

    /**
     * 绑定view
     */
    public void onBindView(V view) {
        this.baseView = view;

    }

    /**
     * 解绑view
     */
    public void onUnBindView() {
        this.baseView = null;
    }

    /**
     * presenter销毁时的操作
     */
    public void OnDestroyPresenter() {

    }

    /**
     * presenter 意外销毁时,它的调用时机和Activity、Fragment、View中的onSaveInstanceState
     *
     * @param outState
     */
    public void onSaveInstanceState(Bundle outState) {
        LogUtil.d(TAG, " presenter onSaveInstanceState");
    }

    /**
     * 获取当前view
     *
     * @return 获取view
     */

    public V getView() {
        return this.baseView;
    }
}

最后,奉上这个项目的github地址:https://github.com/zziafyc/WanAndroid_java,欢迎大家star,谢谢~ ^-^

About

根据鸿洋大神提供的wanandroid api,编写一个属于自己wanandorid项目(java版)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages