Android_MVP優化

Android_MVP優化

在使用的MVP框架模式可以看出它比MVC框架模式更加穩健,但是單純的使用MVP還是有缺點的,因爲Presenter持有了Activity的強引用,但是當presenter在加載數據時通常會有耗時操作,在耗時過程中如果Activity被銷燬,那麼此時presenter持有的MainActivity就無法被回收,此時就會導致內存泄露問題。爲了解決內存泄露問題,可以爲presenter提供弱引用。
1、創建抽象類 BasePresenter(使用泛型,爲presenter持有view)
2、創建MVPBaseActivity(綁定Activity生命週期,兩個泛型)
3、修改MainActivity

BasePresenter(在BasePresenter中設置弱引用)

   /**
   * Presenter控制基類
   */
 public abstract class BasePresenter<T> {
    /**
     * 內存不足時釋放內存
     */
    protected WeakReference<T> mViewRef;
    /**
     * 綁定view
     */
    public void attachView(T view){
        mViewRef=new WeakReference<T>(view);
    };
    //用於在activity銷燬時釋放資源
    public void detachView(){
        if(mViewRef!=null){}
        mViewRef.clear();
        mViewRef=null;
    };
    protected T getView(){
        return mViewRef.get();
    }

}

MVPBaseActivity(MVP模式BaseActivity)

傳遞兩個泛型一個View接口一個Presenter具體類,進行Activity生命週期關聯,避免內存泄露


public abstract class MVPBaseActivity<V,T extends BasePresenter <V>> extends Activity {//Activity可以繼承BaseActivity

    public  T mPresenter;
    @SuppressWarnings("unchecked")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        mPresenter=getPresenter();
        //關聯view
        mPresenter.attachView((V)this);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解關聯view
        mPresenter.detachView();
    }
    //具體的presenter由子類返回
    protected abstract T getPresenter() ;

}

Presenter

public class Presenter extends BasePresenter<IFruitView>{
    //需要持有View和Model接口
    private IFruitView mFruitView;
    private IFruitModel mFruitModel=new FruitModel();
    public Presenter() {
        super();

    }

    public void bind(){
        mFruitView=getView();
        mFruitModel.loadFruits(new IFruitModel.FruitOnloadListener() {

            @Override
            public void onLoadFinish(List<Fruit> fruits) {

                mFruitView.showFruitView(fruits);
            }
        });
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章