MVP框架篇
一、框架的优点:
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();
如果有不明白的或者发现有问题的,请联系我。我的邮箱是:649605126@qq.com,微信号:hailin122024