第二篇、MVP框架完成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值