动态代理实现mvp

就不说啥是mvp了,也不说啥是静态代理动态代理了,直接撸代码吧~

一、创造轮子
1.定义View父类接口
public interface BaseView
{
}
2.定义父类Presenter,持有V的引用
public class BasePresenter<V extends BaseView>
{
    private static final String TAG = "BasePresenter";
    private V baseView;

    public void onBindView(V view)
    {
        this.baseView = view;
    }

    public void onUnbindView()
    {
        this.baseView = null;
    }

    public void onDestroyPersenter()
    {
        Log.e(TAG, "-------> onDestroyPersenter");
    }

    public void onSaveInstanceState(Bundle outState)
    {
        Log.e(TAG, "-------> onSaveInstanceState");
    }

    public V getView()
    {
        return baseView;
    }
}
3.定义允许子类继承父类的注解
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface CreatePresenter
{
    Class<? extends BasePresenter> value();
}
4.创建操作Presenter接口
public interface IPresenterFactory<V extends BaseView, P extends BasePresenter<V>>
{
    /**
     * 创建Presenter
     */
    P createPresenter();
}
5.对接口IPresenterFactory的实现
public class PresenterFactory<V extends BaseView, P extends BasePresenter<V>> implements IPresenterFactory<V, P>
{
    /**
     * 需要创建的Presenter的类型
     */
    private final Class<P> mPresenterClass;

    public PresenterFactory(Class<P> presenterclass)
    {
        this.mPresenterClass = presenterclass;
    }

    public static <V extends BaseView, P extends BasePresenter<V>> PresenterFactory<V, P> createFactory(Class<?> viewClazz)
    {
        CreatePresenter annotation = viewClazz.getAnnotation(CreatePresenter.class);
        Class<P> aClass = null;
        if (null != annotation)
        {
            aClass = (Class<P>) annotation.value();
        }
        return aClass == null ? null : new PresenterFactory<V, P>(aClass);
    }

    @Override
    public P createPresenter()
    {
        try
        {
            return mPresenterClass.newInstance();
        }
        catch (Exception e)
        {
            throw new RuntimeException("Presenter create failed!");
        }
    }
}
6.创建代理Presenter接口,持有对IPresenterFactory的引用
public interface IPresenterProxy<V extends BaseView, P extends BasePresenter<V>>
{
    /**
     * 设置创建Presenter的工厂
     */
    void setPresenterFactory(IPresenterFactory<V, P> presenterFactory);

    /**
     * 获取Presenter的工厂类
     */
    IPresenterFactory<V, P> getPresenterFactory();

    /**
     * 获取创建的Presenter
     */
    P getPresenter();
}
7.对接口IPresenterProxy的实现
public class PresenterProxy<V extends BaseView, P extends BasePresenter<V>> implements IPresenterProxy<V, P>
{
    /**
     * 获取onSaveInstanceState中bundle的key
     */
    private static final String PRESENTER_KEY = "presenter_key";

    /**
     * Presenter工厂类
     */
    private IPresenterFactory<V, P> mFactory;
    private P mPresenter;
    private Bundle mBundle;
    private boolean mIsBindView;

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

    /**
     * 设置Presenter的工厂类,这个方法只能在创建Presenter之前调用,也就是调用getPresenter()之前,如果Presenter已经创建则不能再修改
     * @param presenterfactory IWanPresenterFactory类型
     */
    @Override
    public void setPresenterFactory(IPresenterFactory<V, P> presenterfactory)
    {
        if (null != mPresenter)
        {
            throw new IllegalArgumentException("setPresenterFactory() can only be called before getPresenter() be called");
        }
        this.mFactory = presenterfactory;
    }

    /**
     * 获取Presenter工厂类
     * @return
     */
    @Override
    public IPresenterFactory<V, P> getPresenterFactory()
    {
        return mFactory;
    }

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

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

    /**
     * 销毁Presenter持有的View
     */
    private void onUnbindView()
    {
        if (null != mPresenter && mIsBindView)
        {
            mPresenter.onUnbindView();
            mIsBindView = false;
        }
    }

    /**
     * 销毁Presenter
     */
    public void onDestroy()
    {
        if (null != mPresenter)
        {
            onUnbindView();
            mPresenter.onDestroyPersenter();
            mPresenter = null;
        }
    }

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

    /**
     * 意外关闭恢复Presenter
     * @param savedInstanceState 意外关闭时存储的Bundler
     */
    public void onRestoreInstanceState(Bundle savedInstanceState)
    {
        mBundle = savedInstanceState;
    }
}
8.创建BaseMvpActivity
public abstract class BaseMvpActivity<V extends BaseView, P extends BasePresenter<V>> extends RxAppCompatActivity implements IPresenterProxy<V, P>
{
    private static final String PRESENTER_SAVE_KEY = "presenter_save_key";

    /**
     * 创建被代理对象,传入默认Presenter的工厂
     */
    private PresenterProxy<V, P> mProxy = new PresenterProxy<>(PresenterFactory.<V, P>createFactory(getClass()));
    protected Activity activity;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        if (0 != getContentId())
        {
            setContentView(getContentId());
        }
        activity = this;
        if (null != savedInstanceState)
        {
            mProxy.onRestoreInstanceState(savedInstanceState.getBundle(PRESENTER_SAVE_KEY));
        }
        mProxy.onCreate((V) this);
        initView();
        initData(savedInstanceState);
    }

    @Override
    public void setPresenterFactory(IPresenterFactory<V, P> presenterfactory)
    {
        mProxy.setPresenterFactory(presenterfactory);
    }

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

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

    /**
     * 获取Layout布局
     *
     * @return
     */
    public abstract int getContentId();

    /**
     * 初始化布局资源
     */
    public abstract void initView();

    /**
     * 初始化数据
     *
     * @param savedInstanceState
     */
    public abstract void initData(Bundle savedInstanceState);

    /**
     * @param outState
     */
    @Override
    protected void onSaveInstanceState(Bundle outState)
    {
        super.onSaveInstanceState(outState);
        outState.putBundle(PRESENTER_SAVE_KEY, mProxy.onSaveInstanceState());
    }

    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        mProxy.onDestroy();
    }
}

9.创建BaseMvpFragment
public abstract class BaseMvpFragment<V extends BaseView, P extends BasePresenter<V>> extends RxFragment implements IPresenterProxy<V, P>
{
    private static final String TAG = "BaseMvpFragment";
    private static final String PRESENTER_SAVE_KEY_FRAGMENT = "presenter_save_key_fragment";
    /**
     * 创建被代理对象,传入默认Presenter的工厂
     */
    private PresenterProxy<V, P> mProxy = new PresenterProxy<>(PresenterFactory.<V, P>createFactory(getClass()));
    private View view;
    /**
     * Fragment的View加载完毕的标记
     */
    private boolean isViewCreated;
    /**
     * Fragment对用户可见的标记
     */
    private boolean isDataLoaded;

    @android.support.annotation.Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @android.support.annotation.Nullable ViewGroup container, @android.support.annotation.Nullable Bundle savedInstanceState)
    {
        view = inflater.inflate(getViewLayoutId(), container, false);
        mProxy.onCreate((V) this);
        initView(view);
        Log.e(TAG, "-------> onCreateView");
        return view;
    }

    @Override
    public void onActivityCreated(@android.support.annotation.Nullable Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        isViewCreated = true;
        prepareRequestData();
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser)
    {
        super.setUserVisibleHint(isVisibleToUser);
        prepareRequestData();
        Log.e(TAG, "----@---> setUserVisibleHint");
    }

    public boolean prepareRequestData()
    {
        return prepareRequestData(false);
    }

    public boolean prepareRequestData(boolean forceUpdate)
    {
        if (getUserVisibleHint() && isViewCreated && (!isDataLoaded || forceUpdate))
        {
            initData();
            isDataLoaded = true;
            return true;
        }
        return false;
    }

    /**
     * 布局
     * @return
     */
    public abstract int getViewLayoutId();

    /**
     * 初始化布局资源
     * @return
     */
    public abstract void initView(View view);

    /**
     * 初始化数据
     * @return
     */
    public abstract void initData();

    @Override
    public void onResume()
    {
        super.onResume();
    }

    @Override
    public void onAttach(Context context)
    {
        super.onAttach(context);
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        mProxy.onDestroy();
        Log.e(TAG, "-------> onDestroy");
    }

    @Override
    public void onDestroyView()
    {
        super.onDestroyView();
        Log.e(TAG, "-------> onDestroyView");
    }

    @Override
    public void onSaveInstanceState(Bundle outState)
    {
        super.onSaveInstanceState(outState);
        outState.putBundle(PRESENTER_SAVE_KEY_FRAGMENT, mProxy.onSaveInstanceState());
    }

    @Override
    public void setPresenterFactory(IPresenterFactory<V, P> presenterfactory)
    {
        mProxy.setPresenterFactory(presenterfactory);
    }

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

    @Override
    public P getPresenter()
    {
        return mProxy.getPresenter();
    }
}
二、使用轮子
1.创建登录View
public interface LoginView extends BaseView
{
    // 获取用户名
    String getUserName();
    // 获取用户密码
    String getPasswd();

    // 登录成功时的回调
    void loginSuccess();
    // 登录失败时的回调
    void loginFailed(String errCode, String errMsg);
}
2.创建登录Presenter
public class LoginPresenter extends BasePresenter<LoginView>
{
    /**
     * 登录
     */
    public void login()
    {
        // 获取用户名和密码
        String userName = getView().getUserName();
        String passwd = getView().getPasswd();

        // 进行网络请求...

        // 网络请求登录失败时:
        // 网络请求登录失败的errCode及errMsg
        String errCode = "-5001";
        String errMsg = "用户名密码错误!";
        getView().loginFailed(errCode, errMsg);

        // 网络请求登录成功时:
        getView().loginSuccess();
    }
}
3.创建登录Activity页面
@CreatePresenter(LoginPresenter.class)
public class LoginActivity extends BaseMvpActivity<LoginView, LoginPresenter> implements LoginView
{
    private EditText user_name;
    private EditText user_password;
    private Button btn_login;

    @Override
    public int getContentId()
    {
        return R.layout.activity_login_layout;
    }

    @Override
    public void initView()
    {
        user_name = this.findViewById(R.id.user_name);
        user_password = this.findViewById(R.id.user_password);
        btn_login = this.findViewById(R.id.btn_login);
    }

    @Override
    public void initData(Bundle savedInstanceState)
    {
        btn_login.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (TextUtils.isEmpty(getUserName()))
                {
                    ToastUtil.showToast("用户名不能为空!");
                    return;
                }
                if (TextUtils.isEmpty(getPasswd()))
                {
                    ToastUtil.showToast("密码不能为空!");
                    return;
                }
                ARouter.getInstance().build(ARouterUtil.MAINACTIVITY).navigation();
                finish();
            }
        });
    }

    @Override
    public String getUserName()
    {
        return user_name.getText().toString().trim();
    }

    @Override
    public String getPasswd()
    {
        return user_password.getText().toString().trim();
    }

    @Override
    public void loginSuccess()
    {
        // 执行页面跳转
    }

    @Override
    public void loginFailed(String errCode, String errMsg)
    {
        // 打印errCode和errMsg
    }
}
BaseMvpFragment与BaseMvpActivity使用方法相同,就不写使用方法了!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值