亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

MVP簡(jiǎn)介

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

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

P-Presenter,中介者,連接Modle,View層,同時(shí)持有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ù)的任務(wù)委派給中介者presenter,并傳入自身實(shí)例對(duì)象,實(shí)現(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ù)的操作實(shí)際在Modle層執(zhí)行
    modle = new TestModle(new CallbackListener() {
      public void onGetData(String data) {
        if (view != null) {
          view.onGetData(data);
        }
      }
    });
    modle.getData();
  }
}

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

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

內(nèi)存泄露問題

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

答案是不能! 

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

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

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

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

比如示例代碼:
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)用框架的取消任務(wù)api
}

個(gè)人總結(jié)

因?yàn)槊嫦騇VP接口編程,可適應(yīng)需求變更,所以MVP適用于比較大的項(xiàng)目;因?yàn)槠浜?jiǎn)化了Activity和Fragmnt的職責(zé),可大大減少View層的代碼量,比起MVC中Activity,F(xiàn)ragment動(dòng)不動(dòng)上千行的代碼量,簡(jiǎn)直優(yōu)雅!

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

相關(guān)文章

  • Flutter 網(wǎng)絡(luò)請(qǐng)求框架封裝詳解

    Flutter 網(wǎng)絡(luò)請(qǐng)求框架封裝詳解

    這篇文章主要介紹了Flutter 網(wǎng)絡(luò)請(qǐng)求框架封裝詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • android利用websocket協(xié)議與服務(wù)器通信

    android利用websocket協(xié)議與服務(wù)器通信

    這篇文章主要為大家詳細(xì)介紹了android利用websocket協(xié)議與服務(wù)器通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Android四大組件之廣播BroadcastReceiver詳解

    Android四大組件之廣播BroadcastReceiver詳解

    Android開發(fā)的四大組件分別是:活動(dòng)(activity),用于表現(xiàn)功能;服務(wù)(service),后臺(tái)運(yùn)行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫(kù),本篇著重介紹廣播組件
    2021-11-11
  • Android實(shí)現(xiàn)透明度可變的標(biāo)題欄效果

    Android實(shí)現(xiàn)透明度可變的標(biāo)題欄效果

    這篇文章主要介紹了Android實(shí)現(xiàn)透明度可變的標(biāo)題欄效果的相關(guān)資料,具有一定的參考價(jià)值,需要的朋友可以參考下
    2016-02-02
  • android 獲取上一個(gè)activity返回值的方法

    android 獲取上一個(gè)activity返回值的方法

    android 獲取上一個(gè)activity返回值的方法,需要的朋友可以參考一下
    2013-06-06
  • Android實(shí)現(xiàn)帶動(dòng)畫效果的可點(diǎn)擊展開TextView

    Android實(shí)現(xiàn)帶動(dòng)畫效果的可點(diǎn)擊展開TextView

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)帶動(dòng)畫效果的可點(diǎn)擊展開TextView,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Android實(shí)現(xiàn)滑動(dòng)折疊Header全流程詳解

    Android實(shí)現(xiàn)滑動(dòng)折疊Header全流程詳解

    這篇文章主要介紹了Android實(shí)現(xiàn)滑動(dòng)折疊Header,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • Android 組合控件實(shí)現(xiàn)布局的復(fù)用的方法

    Android 組合控件實(shí)現(xiàn)布局的復(fù)用的方法

    本篇文章主要介紹了Android 組合控件實(shí)現(xiàn)布局的復(fù)用的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Android在listview添加checkbox實(shí)現(xiàn)原理與代碼

    Android在listview添加checkbox實(shí)現(xiàn)原理與代碼

    Android在listview添加checkbox如何實(shí)現(xiàn)一直都是新手朋友們的頭疼問題,接下來為您詳細(xì)介紹實(shí)現(xiàn)方法,感興趣的朋友可以了解下
    2013-01-01
  • Android適配器(Adapter)的概念與自定義

    Android適配器(Adapter)的概念與自定義

    這篇文章主要給大家介紹了關(guān)于Android適配器(Adapter)的相關(guān)資料,適配器是一個(gè)非常重要的知識(shí)點(diǎn),Adapter是用來幫助填出數(shù)據(jù)的中間橋梁,本文介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07

最新評(píng)論