最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android開發(fā):淺談MVP模式應用與內(nèi)存泄漏問題解決

 更新時間:2016年11月25日 08:34:39   作者:xiong_it  
本篇文章主要介紹了Android開發(fā):MVP模式應用與內(nèi)存泄漏問題解決,具有一定的參考價值,有需要的可以了解一下。

最近博主開始在項目中實踐MVP模式,卻意外發(fā)現(xiàn)內(nèi)存泄漏比較嚴重,但卻很少人談到這個問題,促使了本文的發(fā)布,本文假設讀者已了解MVP架構。

MVP簡介

M-Modle,數(shù)據(jù),邏輯操作層,數(shù)據(jù)獲取,數(shù)據(jù)持久化保存。比如網(wǎng)絡操作,數(shù)據(jù)庫操作

V-View,界面展示層,Android中的具體體現(xiàn)為Activity,F(xiàn)ragment 

P-Presenter,中介者,連接Modle,View層,同時持有modle引用和view接口引用

示例代碼
Modle層操作

public class TestModle implements IModle{
  private CallbackListener callback;

  public TestModle(CallbackListener callback) {
    this.callback = callback;
  }
  public interface CallbackListener {
    void onGetData(String data);
  }
  public void getData() {
    new Thread() {
      public void run() {
        callback.onGetData("返回的數(shù)據(jù)");
      }
    }.start();
  }
}

View層

// 抽象的view層
public interface TestViewInterf extends IView {
  void onGetData(String data);
}

// 具體的View層
public class MainActivity extends Activity implements TestViewInterf{
  private TestPresenter mTestPresenter;

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // view層將獲取數(shù)據(jù)的任務委派給中介者presenter,并傳入自身實例對象,實現(xiàn)TestViewInterf接口
    mTestPresenter = new TestPresenter(this);
    mTestPresenter.getData();
  }

  @Override
  public void onGetData(String data) {
    // View層只做數(shù)據(jù)展示
    showToast(data);
  }

  private void showToast(String toast) {
    Toast.makeText(this, toast, Toast.LENGTH_LONG).show();
  }
}

Presenter中介者

public class TestPresenter implements IPresenter{
  IModle modle;
  IView view;
  public TestPresenter(IView view) {
    this.view = view;
  }

  public void getData() {
    // 獲取數(shù)據(jù)的操作實際在Modle層執(zhí)行
    modle = new TestModle(new CallbackListener() {
      public void onGetData(String data) {
        if (view != null) {
          view.onGetData(data);
        }
      }
    });
    modle.getData();
  }
}

根據(jù)OOP思想,Java應面向接口編程,這樣才能給符合OCP原則。上述示例代碼省略了更加抽象的接口IModle,IView,IPresenter,并且實際MVP實踐中通常會引入泛型使其更具擴展性。

Google已提供了相關示例代碼,并在MVP中增加了一個約束者:Contract,它的作用是定義各個模塊的MVP接口。
google MVP sample code:https://github.com/googlesamples/android-architecture

內(nèi)存泄露問題

由上可見,Presenter中持有View接口對象,這個接口對象實際為MainActivity.this,Modle中也同時擁有Presenter對象實例,當MainActivity要銷毀時,Presenter中有Modle在獲取數(shù)據(jù),那么問題來了,這個Activity還能正常銷毀嗎?

答案是不能! 

當Modle在獲取數(shù)據(jù)時,不做處理,它就一直持有Presenter對象,而Presenter對象又持有Activity對象,這條GC鏈不剪斷,Activity就無法被完整回收。 

換句話說:Presenter不銷毀,Activity就無法正常被回收。

解決MVP的內(nèi)存泄露

Presenter在Activity的onDestroy方法回調(diào)時執(zhí)行資源釋放操作,或者在Presenter引用View對象時使用更加容易回收的軟引用,弱應用。 

比如示例代碼:
Activity

@Override
  public void onDestroy() {
    super.onDestroy();
    mPresenter.destroy();
  }

Presenter

public void destroy() {
  view = null;
  if(modle != null) {
    modle.cancleTasks();
  }
}

Modle

public void cancleTasks() {
  // TODO 終止線程池ThreadPool.shutDown(),AsyncTask.cancle(),或者調(diào)用框架的取消任務api
}

個人總結

因為面向MVP接口編程,可適應需求變更,所以MVP適用于比較大的項目;因為其簡化了Activity和Fragmnt的職責,可大大減少View層的代碼量,比起MVC中Activity,F(xiàn)ragment動不動上千行的代碼量,簡直優(yōu)雅!

做完以上操作,由于MVP引起的內(nèi)存泄露就差不多解決了,以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android 自定義返回按鈕的實例詳解

    Android 自定義返回按鈕的實例詳解

    這篇文章主要介紹了Android 自定義返回按鈕的實例詳解的相關資料,這里提供實現(xiàn)代碼,幫助大家理解使用,需要的朋友可以參考下
    2017-07-07
  • Android ViewDragHelper使用方法詳解

    Android ViewDragHelper使用方法詳解

    這篇文章主要為大家詳細介紹了Android ViewDragHelper的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android Service 服務不被殺死的妙招

    Android Service 服務不被殺死的妙招

    這篇文章主要介紹了Android Service 服務不被殺死的妙招的相關資料,需要的朋友可以參考下
    2015-11-11
  • Android獲取高清app圖標代碼分享

    Android獲取高清app圖標代碼分享

    這篇文章主要為大家分享了Android獲取高清app圖標代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android拼圖游戲 玩轉從基礎到應用手勢變化

    Android拼圖游戲 玩轉從基礎到應用手勢變化

    這篇文章主要介紹了Android拼圖游戲的實現(xiàn)方法,教大家玩轉從基礎到應用手勢變化,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Android ListView實現(xiàn)圖文列表顯示

    Android ListView實現(xiàn)圖文列表顯示

    這篇文章主要為大家詳細介紹了Android ListView實現(xiàn)圖文列表顯示,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Android 中Volley二次封裝并實現(xiàn)網(wǎng)絡請求緩存

    Android 中Volley二次封裝并實現(xiàn)網(wǎng)絡請求緩存

    這篇文章主要介紹了Android 中Volley二次封裝并實現(xiàn)網(wǎng)絡請求緩存的相關資料,希望通過本文能幫助到大家,徹底會使用Volley,需要的朋友可以參考下
    2017-09-09
  • Kotlin中的handler如何避免內(nèi)存泄漏詳解

    Kotlin中的handler如何避免內(nèi)存泄漏詳解

    Handler,我們已經(jīng)相當熟悉了,而且經(jīng)常用得不亦樂乎,但就是因為太熟悉了,才會偶爾被它反捅一刀,血流不止,下面這篇文章主要給大家介紹了關于Kotlin中handler如何避免內(nèi)存泄漏的相關資料,需要的朋友可以參考下。
    2017-12-12
  • Android 實現(xiàn)右滑返回功能

    Android 實現(xiàn)右滑返回功能

    右滑返回功能在ios上非常實用,因為它的返回鍵在左上角,下面腳本之家小編給大家?guī)砹薃ndroid 實現(xiàn)右滑返回功能,感興趣的朋友一起看看吧
    2018-04-04
  • 史上最全的Android build.gradle配置教程

    史上最全的Android build.gradle配置教程

    這篇文章主要給大家介紹了關于Android build.gradle配置的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08

最新評論

都昌县| 浮山县| 徐闻县| 正蓝旗| 伊川县| 云梦县| 平凉市| 满洲里市| 泽库县| 安泽县| 石台县| 诏安县| 东辽县| 灵璧县| 大连市| 同江市| 鹿泉市| 同心县| 龙陵县| 什邡市| 忻城县| 博爱县| 中阳县| 赤峰市| 米易县| 宜都市| 建昌县| 美姑县| 蕲春县| 凉山| 北流市| 镶黄旗| 桂林市| 松溪县| 习水县| 灵璧县| 区。| 繁昌县| 高雄县| 济阳县| 夹江县|