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
阅读全文
0 0
- Android中MVP模式的创建P的注解工厂,代理模式绑定和V的生命周期以恢复数据(四)
- MVP模式下的生命周期
- Android的MVP模式
- Android的MVP模式
- Android的MVP模式
- Android的MVP模式
- 如何在MVP模式中控制RxAndroid的生命周期?
- 谈谈关于MVP模式中V-P交互问题
- 谈谈关于MVP模式中V-P交互问题
- 谈谈关于MVP模式中V-P交互问题
- Android中 MVP模式的使用
- Android中MVP模式的简单实现
- Android中Mvp模式的简单示例
- Android中Mvp模式的使用
- Android中MVP模式的简单应用
- 理解中Android的MVP开发模式~
- Android中MVP模式的实例
- Android中mvp模式的使用
- 171223 逆向-JarvisOJ(EvilExe)
- MATLAB 并行for运算
- MATLAB Tricks (Updating)
- LaTex Tricks (Updating)
- CentOS 7.3+PHP7.2+mysql5.7+Workerman3安装
- Android中MVP模式的创建P的注解工厂,代理模式绑定和V的生命周期以恢复数据(四)
- 使用valgrind的callgrind工具进行多线程性能分析
- 在PyQt5中的菜单栏和工具栏
- 各大公司Java后端开发面试题总结(2017更新)-慢慢看
- norflash芯片内执行(XIP)
- 1224的坑
- Kotlin学习笔记1-2 入门-常用写法
- profiling tools
- LeetCode 732. My Calendar III