android中使用MVP开发简单模版设计

最近逛各大论坛时经常听到大家提及MVP(Model-View-Presenter)模式在Android开发中的优势,比如:易于维护易于测试松耦合复用性高等优点。于是自己就百度,Google一番,看了一些别人对MVP的讲解和使用示例,感觉真心不错,好用,不足的是在网上搜索到的关于MVP的大多都是讲理论,稍微好点的会附带一个简单的demo,并没有讲MVP在Android开发项目时如何较好的设计和需要注意的一些东西,这就导致我们这些不熟悉MVP的小白,了解了MVP的皮毛,但不敢用于实际项目中。经过最近一段时间对MVP的了解和学习,我自己慢慢总结出了一个MVP简易的开发模版,在这分享出来,供大家参考,不足之处请多多指教。……_


不了解MVP的可以参考一下文章,写的不错的


MVP模式简介

图片来自:浅谈Andorid开发中的MVP模式
  • 从图中可知View不直接与Model交互,而是通过与Presenter来与Model间接交互。
  • Presenter与View的交互是通过接口来进行的。
  • Presenter与Model的交互也是通过接口来进行的。
  • 通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑。
  • Presenter拥有View和Model的实例。

MVP在Android开发中内存溢出问题

(参考Android源码设计模式解析与实战)

  • Android开发中我们必须要跟Activity打交道,跟Activity打交道时,我们自然而然要考虑到生命周期的问题。在MVP模式中Activity作为View层,它是被Presenter持有强引用的,如果我们在Presenter中做一些耗时的处理网络请求等,并且Activity在耗时操作完成之前销毁,这样就导致Presenter一直持有Activity的引用,Activity无法被回收,此时就会发生内存泄漏。解决办法就是让Presenter 持有Activity的弱引用。

    1创建一个Presenter抽象命名为BasePresenter,它是一个泛型类,泛型类型为View角色要实现的接口类型。代码如下:

/** * 
* @param <V>代表view接口 
*备注:ImvpBaseView 为一个空接口,
明确泛型 V 是一个View角色要实现的接口类型
(所有的View接口都要继承ImvpBaseView接口可以把所有接口都要拥有的方法放到ImvpBaseView)
*/
public abstract class BasePresenter <V extends ImvpBaseView> {  
  protected Reference<V>mViewRef;  
//建立关联 
  public void attachView(V view){           
     mViewRef=new WeakReference<V>(view);  
  } 
//获取view 
  protected V getView(){  
      return mViewRef.get(); 
   }    
//判断是否与View建立了关联
public boolean isViewAttached(){  
      return mViewRef!=null && mViewRef.get()!=null; 
   }   

 //该方法在activity或者Fragment的onDestory中调用 
   public void detachView(){  
      if(mViewRef!=null){    
        mViewRef.clear();     
       mViewRef=null;     
   }   
 }}

2.创建MVPBaseActivity基类,通过这个基类的声明周期函数来控制它与Presenter的关系,代码如下:Fragment的基类创建类似

/** * 
* @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();
}

经过1,2步的处理我们就可以避免使用MVP时造成内存泄漏的问题了。


读到这里,有些读者可能抱怨说, 博客标题叫android中使用MVP开发简单模版,但是以上都是MVP模式的简介和android中使用时注意的问题,并没有涉及到模版,这不是坑人吗?人与人之间的信任呢?诚实守信是我们中华的美德,作为天朝的开发者,怎能不弘扬呢?

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

作为开发者我们肯定有自己的开发基本库,用于收藏一些公共开发使用的工具和功能。上面的MVP的抽象的泛型的解决办法一看就是通用的,肯定要收藏到我们的基本开发库中,方便以后我们开发使用。就拿我个人而言,开发项目时我所有的Activity继承于BaseActivity(在实际项目),BaseActivity继承于AndBaseActivity(基础开发库中),AndBaseActivity继承于AppCompatActivity(当然你可以使用Activity)如下图:

图1

如果我将MVPBaseActivity收入到我的基本库中时,继承结构如下图:


图2

备注:Fragment的结构设计类似,这里就不给出了。

完整的MVP的简单模版的简易UML图如下:

MVP模版.png
  • 第一层是在基本类库中解决通用的功能比如:上文讲到的MVP 造成的内存泄漏。

  • 第二层是在我们实际项目中的,目的是放项目中一些共用的方法和属性。

  • 第三层就是我们具体的Model-View-Presenter,处理具体的业务逻辑和展示具体的view。

  • MVP模式中,Presenter拥有的Model和View都是接口实例,这就是说我们在做一个功能是就要创建一套Model-View-Presenter。
    这里拿获取天气信息使用MVP模式为例,我们就需要创建WeatherPresenter,IWeatherModel接口,IWeatherView接口,
    IWeatherModel的实现类WeatherModelImpl, IWeahterView的实现类WeatherShowActivity。从这可以看出如果我们一个项目做完,会创建很多的接口和实现类,接口爆炸的赶脚,我们可以简化Model的设计,来减少接口。
    Model层主要用于本地数据的增删改查个人观点,功能比较明确,所以可以用一个接口IBaseMode<T>把所有的方法定义好,并通过SampleModelAdapter<T>实现该接口的所有方法空实现,然后我们具体的model继承SampleModelAdapter<T>去重写自己业务具体要做的数据保存方法,比如有些数据只需要缓存,就不用重写数据库的方法,而有些数据要保存在本地数据库中,也就不用重写缓存方法。


以上只是个人在学习MVP模式开发中,总结的简单模版设计,不足之处,请留言,本人会尽快修正!Thanks…………Y(_)Y

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容