第二篇、MVP框架完成
来源:互联网 发布:上海市网络挂号平台 编辑:程序博客网 时间:2024/06/07 05:55
MVP框架篇
上一篇
GitHub项目地址
一、框架的优点:
1、本框架支持两种架构,更加灵活使用。如果是MVC,则子类Activity只需继承CommonActivity,如果是使用mvp架构,则子类的Activity需要继承MvpActivity。
2、Presenter的生命周期与Activity、Fragment的生命周期绑定,Activity、Fragment创建(onCreate),则Presenter同时也被创建。Activity、Fragment被销毁(onDestory),Presenter同时也被销毁。
3、Presenter进行了缓存、复用,防止多次创建消耗内存。
4、对异常情况,Presenter的缓存处理,如横竖屏切换、内存不够杀死APP。
5、用注解的方式,直接获取需要的Presenter
6、其他的优点:toast提示,Handler的获取、针对不同的状态页面(成功、失败、数据为空的页面)处理等。
具体的实现方式:
二、具体使用说明:
@TargetLog(TestActivity.class)@TargetPresenter(TestPresenter.class)public class TestActivity extends MvpActivity<TestPresenter> implements Contract.IView<TestBean>{ @BindView(R.id.test_rllyt) RoundRectLinearLayout mTestRllyt; private TestPresenter mPresenter; @Override protected int getContentViewId() { return R.layout.activity_test; } @Override protected void init(Bundle savedInstanceState) { mPresenter = createPresenter(); //绑定 } @OnClick({R.id.number_tv,R.id.code_tv}) public void onClick(View view ){ switch (view.getId()){ case R.id.number_tv: mPresenter.startWork(); break; case R.id.code_tv: startActivity(new Intent(TestActivity.this,TestTwoActivity.class)); break; } } @Override public Context getViewContext() { return this; } //请求成功,展示成功页面 @Override public void showContentView() { mTestRllyt.showContentView(); } //请求失败,显示错误页面 @Override public void showError(String errorInfo, int errorCode) { mTestRllyt.showEmptyView(); } //设置数据 @Override public void showContentData(TestBean data) { if (data != null) { LogUtil.showLog(TestActivity.class,data.toString()); } }}
步骤:
1、TestActivity extends MvpActivity
2、泛型中指定TestActivity 的Presenter逻辑处理TestPresenter,这样获取TestPresenter只需要直接调用createPresenter()方法即可获取。
3、开始进行网络(或其他逻辑)请求是,只需要调用startWork()方法即可,即mPresenter.startWork()
再来看看逻辑处理类Presenter
@TargetLog(TestPresenter.class)public class TestPresenter extends Contract.IPresenter { @Override public void startWork() { getDataFromNet(); } @Override public void getDataFromNet() { AppUtil.checkNotNull(mView,"View == null,use TestPresenter is not attachView view!"); TestBean bean = new TestBean("测试mvp架构", 12); mView.showContentData(bean); mView.showContentView(); }}
TestPresenter中需用重写getDataFromNet()方法,因为在这里考虑一般的都会有网络请求业务。如果还要获取更多的数据,则可以调用getMoreDataFromNet()方法。在getDataFromNet()请求成功后,分别调用 mView.showContentData(bean)、mView.showContentView()方法。再在TestActivity 中设置数据。
本框架支持网络访问成功页面、失败页面、网络错误页面、正在加载页面。并支持自定义。
三、优点阐述:
1、Presenter的生命周期与Activity、Fragment的生命周期绑定,Activity、Fragment创建(onCreate),则Presenter同时也被创建。Activity、Fragment被销毁(onDestory),Presenter同时也被销毁。
2、Presenter进行了缓存、复用,防止多次创建消耗内存。
在PresenterStorage中,使用软引用new WeakHashMap
/*** * call:被调用情景 * 1.横竖屏切换 * 2.前后台切换 * 3.内存吃紧,回收内存,APP强制退出 */ @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { if (mPresenterManager != null) { outState.putBundle(KEY_PRESENTER_BUNDLE,mPresenterManager.onSaveInstanceState()); } super.onSaveInstanceState(outState, outPersistentState); }
获取过程:
@Override protected void initialize(Bundle savedInstanceState) { if (mPresenterManager != null) { mPresenterManager.onCreate(this); } if (savedInstanceState != null) { Bundle bundle = savedInstanceState.getBundle(KEY_PRESENTER_BUNDLE); if (bundle != null) { mPresenterManager.onRestoreInstanceState(bundle); } } init(savedInstanceState); }
Presenter缓存思路总结:
<1>.存储过程:
1)用HashMap缓存Presenter。
2)将PresenterId缓存到bundle中,若内存中有新的bundle出现时(如横竖屏切换、内存吃紧强制退出app,保存了上次退出的bundle),都重新缓存PresenterId,onSaveInstanceState().
注意:每次bundle出现时,都需要重新缓存bundle,onRestoreInstanceState()
<2>.取出过程:
1)先将缓存在bundle中的PresenterId取出,然后通过PresenterId从WeakHashMap集合中取出Presenter
2)若内存中没有缓存bundle,然后PresenterFactory中回调获取Presenter
四、其他优点:
1、弹窗toast。
1)首先注解@TargetLog(类名.class) , 然后
若在fragment、activity中,只需要调用showLog(“打印的日志内容”);
若其他类中LogUtil.showLog(类名.class,“打印的日志内容”);
注意:默认是debug级别,如果需要指定日志级别(如是error级别),则showLog(“打印的日志内容”,LogUtil.Logs.e);
2、Handler的获取
使用了build模式,在HandlerUtil中封装了handler的对象的获取,以及message的发送
new HandlerUtil.Build(getMainLooper()) { @Override public void receiveMessage(Message msg) { //接收消息 } }.builer();
GitHub项目地址
上一篇
如果有不明白的或者发现有问题的,请联系我。我的邮箱是:649605126@qq.com,微信号:hailin122024
- 第二篇、MVP框架完成
- 使用MVP完成购物车的基础框架
- MVP框架
- mvp框架
- MVP框架
- 开发框架学习篇之MVP
- MVC框架、mvp
- android MVP框架
- Android的MVP框架
- android 框架 MVP
- [androiod]_[MVP框架]
- MVP框架分析
- MVP框架设计详解
- 搭建MVP模板框架
- MVP快速开发框架
- 初入MVP框架
- MVP框架设计详解
- android项目框架MVP
- 反射排序
- Linux之TCPIP内核参数优化
- 博通(Broadcom)要收购高通?看传闻可能性很大
- win10 安装mysql5.7.19 检测失败 server failed
- IntelliJ IDEA 常用快捷键
- 第二篇、MVP框架完成
- 微信jsdk中 config的获取类
- 自定义View的生命周期
- Jquery,JS全部替换replace
- 希拉里就AI发出警告: 人类完全没准备好
- Map(4)--HashMap
- MySQL 加锁处理分析
- 在win7下配置pyspark在jupyter notebook中使用的简单方法
- [Sencha] 深入 Sencha 类中的 配置项(Config) 系统