android中使用MVP開發(fā)簡單模版設計

最近逛各大論壇時經(jīng)常聽到大家提及MVP(Model-View-Presenter)模式在Android開發(fā)中的優(yōu)勢,比如:易于維護,易于測試,松耦合復用性高等優(yōu)點。于是自己就百度,Google一番,看了一些別人對MVP的講解和使用示例,感覺真心不錯,好用,不足的是在網(wǎng)上搜索到的關于MVP的大多都是講理論,稍微好點的會附帶一個簡單的demo,并沒有講MVP在Android開發(fā)項目時如何較好的設計和需要注意的一些東西,這就導致我們這些不熟悉MVP的小白,了解了MVP的皮毛,但不敢用于實際項目中。經(jīng)過最近一段時間對MVP的了解和學習,我自己慢慢總結出了一個MVP簡易的開發(fā)模版,在這分享出來,供大家參考,不足之處請多多指教?!?sup>_


不了解MVP的可以參考一下文章,寫的不錯的


MVP模式簡介

圖片來自:淺談Andorid開發(fā)中的MVP模式
  • 從圖中可知View不直接與Model交互,而是通過與Presenter來與Model間接交互。
  • Presenter與View的交互是通過接口來進行的。
  • Presenter與Model的交互也是通過接口來進行的。
  • 通常View與Presenter是一對一的,但復雜的View可能綁定多個Presenter來處理邏輯。
  • Presenter擁有View和Model的實例。

MVP在Android開發(fā)中內(nèi)存溢出問題

(參考Android源碼設計模式解析與實戰(zhàn))

  • Android開發(fā)中我們必須要跟Activity打交道,跟Activity打交道時,我們自然而然要考慮到生命周期的問題。在MVP模式中Activity作為View層,它是被Presenter持有強引用的,如果我們在Presenter中做一些耗時的處理網(wǎng)絡請求等,并且Activity在耗時操作完成之前銷毀,這樣就導致Presenter一直持有Activity的引用,Activity無法被回收,此時就會發(fā)生內(nèi)存泄漏。解決辦法就是讓Presenter 持有Activity的弱引用。

    1創(chuàng)建一個Presenter抽象命名為BasePresenter,它是一個泛型類,泛型類型為View角色要實現(xiàn)的接口類型。代碼如下:

/** * 
* @param <V>代表view接口 
*備注:ImvpBaseView 為一個空接口,
明確泛型 V 是一個View角色要實現(xiàn)的接口類型
(所有的View接口都要繼承ImvpBaseView接口可以把所有接口都要擁有的方法放到ImvpBaseView)
*/
public abstract class BasePresenter <V extends ImvpBaseView> {  
  protected Reference<V>mViewRef;  
//建立關聯(lián) 
  public void attachView(V view){           
     mViewRef=new WeakReference<V>(view);  
  } 
//獲取view 
  protected V getView(){  
      return mViewRef.get(); 
   }    
//判斷是否與View建立了關聯(lián)
public boolean isViewAttached(){  
      return mViewRef!=null && mViewRef.get()!=null; 
   }   

 //該方法在activity或者Fragment的onDestory中調(diào)用 
   public void detachView(){  
      if(mViewRef!=null){    
        mViewRef.clear();     
       mViewRef=null;     
   }   
 }}

2.創(chuàng)建MVPBaseActivity基類,通過這個基類的聲明周期函數(shù)來控制它與Presenter的關系,代碼如下:Fragment的基類創(chuàng)建類似

/** * 
* @param <V> 代表View接口 
* @param <P> 代表代理presenter 
*/
public abstract class MVPBaseActivity<V extends ImvpBaseView,
 P extends BasePresenter<V>> extends Activity { 

   protected P mPresenter;  

  @SuppressWarnings("unchecked")  
  @Override 
   protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);    
    mPresenter = createPresenter();  
      mPresenter.attachView((V) this);  
  }   
 @Override
    protected void onDestroy() {  
      super.onDestroy();    
    if (mPresenter != null)  
          mPresenter.detachView(); 
   }   
 protected abstract P createPresenter();
}

經(jīng)過1,2步的處理我們就可以避免使用MVP時造成內(nèi)存泄漏的問題了。


讀到這里,有些讀者可能抱怨說, 博客標題叫android中使用MVP開發(fā)簡單模版,但是以上都是MVP模式的簡介和android中使用時注意的問題,并沒有涉及到模版,這不是坑人嗎?人與人之間的信任呢?誠實守信是我們中華的美德,作為天朝的開發(fā)者,怎能不弘揚呢?

hah客官莫急,下面就是我們的菜啦

作為開發(fā)者我們肯定有自己的開發(fā)基本庫,用于收藏一些公共開發(fā)使用的工具和功能。上面的MVP的抽象的泛型的解決辦法一看就是通用的,肯定要收藏到我們的基本開發(fā)庫中,方便以后我們開發(fā)使用。就拿我個人而言,開發(fā)項目時我所有的Activity繼承于BaseActivity(在實際項目),BaseActivity繼承于AndBaseActivity(基礎開發(fā)庫中),AndBaseActivity繼承于AppCompatActivity(當然你可以使用Activity)如下圖:

圖1

如果我將MVPBaseActivity收入到我的基本庫中時,繼承結構如下圖:


圖2

備注:Fragment的結構設計類似,這里就不給出了。

完整的MVP的簡單模版的簡易UML圖如下:

MVP模版.png
  • 第一層是在基本類庫中解決通用的功能比如:上文講到的MVP 造成的內(nèi)存泄漏。

  • 第二層是在我們實際項目中的,目的是放項目中一些共用的方法和屬性。

  • 第三層就是我們具體的Model-View-Presenter,處理具體的業(yè)務邏輯和展示具體的view。

  • MVP模式中,Presenter擁有的Model和View都是接口實例,這就是說我們在做一個功能是就要創(chuàng)建一套Model-View-Presenter。
    這里拿獲取天氣信息使用MVP模式為例,我們就需要創(chuàng)建WeatherPresenter,IWeatherModel接口,IWeatherView接口,
    IWeatherModel的實現(xiàn)類WeatherModelImpl, IWeahterView的實現(xiàn)類WeatherShowActivity。從這可以看出如果我們一個項目做完,會創(chuàng)建很多的接口和實現(xiàn)類,接口爆炸的趕腳,我們可以簡化Model的設計,來減少接口。
    Model層主要用于本地數(shù)據(jù)的增刪改查個人觀點,功能比較明確,所以可以用一個接口IBaseMode<T>把所有的方法定義好,并通過SampleModelAdapter<T>實現(xiàn)該接口的所有方法空實現(xiàn),然后我們具體的model繼承SampleModelAdapter<T>去重寫自己業(yè)務具體要做的數(shù)據(jù)保存方法,比如有些數(shù)據(jù)只需要緩存,就不用重寫數(shù)據(jù)庫的方法,而有些數(shù)據(jù)要保存在本地數(shù)據(jù)庫中,也就不用重寫緩存方法。


以上只是個人在學習MVP模式開發(fā)中,總結的簡單模版設計,不足之處,請留言,本人會盡快修正!Thanks…………Y(_)Y

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容