如何更高效的使用MVP以及官方MVP架构解析

本文探讨了在Android中高效使用MVP架构的方法,重点解决了Presenter持有Activity导致的内存泄漏问题。介绍了BasePresenter、BaseView和BaseMvpActivity等基础组件,以及如何通过Contract接口进行模块化管理。同时,文章分析了官方MVP架构,指出Fragment更适合作为View层,并展示了如何在Fragment中绑定Presenter以避免内存泄漏。
摘要由CSDN通过智能技术生成

转载请标明出处:
http://blog.csdn.net/dantestones/article/details/51445208

Android mvp 架构的自述中我简单的介绍了mvp,以及怎么写mvp。我自己也将mvp运用到了项目中,其实mvp并没有固定的写法,正确的去理解架构的思想,都可以有自己独特的mvp写法。git上也有很多例子,比如google的android-architecture,simple哥的Android 源码设计模式解析与实战中也有mvp的讨论。这里参考了simple哥做了一个通用版的mvp,并对google的MVP做了一点自己的解析。

关于presenter一直持有Activity对象导致的内存泄漏问题

只要用过mvp这个问题可能很多人都知道。写mvp的时候,presenter会持有view,如果presenter有后台异步的长时间的动作,比如网络请求,这时如果返回退出了Activity,后台异步的动作不会立即停止,这里就会有内存泄漏的隐患,所以会在presenter中加入一个销毁view的方法。现在就在之前的项目中做一下修改

//presenter中添加mvpView 置为null的方法
public void onDestroy(){    
    mvpView = null;
}

//退出时销毁持有Activity
@Override
protected void onDestroy() {    
    mvpPresenter.onDestroy();    
    super.onDestroy();
}

presenter中增加了类似的生命周期的方法,用来在退出Activity的时候取消持有Activity。

但是在销毁后需要思考一点,后台的延时操作返回时,这个时候view被销毁了,如果接着去调用view的方法就 会抛出空指针异常。所以在后台的延时操作中需要考虑到这种可能产生空指针的情况,尤其是网络请求。

BasePresenter

如果每一个Activity都需要做绑定和解绑操作就太麻烦了,现在我希望可以有一个通用的presenter来为我们添加view的绑定与销毁。

public abstract class BasePresenter<T> {
      

     public T mView;    

     public void attach(T mView) {       
         this.mView = mView;    
     }    

     public void dettach() {        
         mView = null;    
     }
}

因为不能限定死传入的View,所以使用泛型来代替传入的对象。通过这个通用的presenter我就可以把原来的MvpPresenter简化成下面的样子

public class NewMvpPresenter extends BasePresenter<NewMvpView> {
      

    private RequestBiz requestBiz;    
    private Handler mHandler;    

    public NewMvpPresenter() {        
        requestBiz = new RequestBiziml();       
        mHandler = new Handler(Looper.getMainLooper());    
   }    

    public void onResume(){        
        requestBiz.requestForData(new OnRequestListener() {                        
             @Override            
             public void onSuccess(final List<String> data) {                
                 mHandler.post(new Runnable() {                    
                    @Override                   
                    public void run() {                       
                        mView.hideLoading();                        
                        mView.setListItem(data);                    
                   }               
               });            
            }            

             @Override            
             public void onFailed() {                
                 mView.showMessage("请求失败");            
             }        
        });    
      }    

    public void onItemClick(int position){        
     
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值