第二篇、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