亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android內存泄漏終極解決篇(下)

2020-04-11 11:00:28
字體:
來源:轉載
供稿:網友

一、概述

Android內存泄漏終極解決篇(上)中我們介紹了如何檢查一個App是否存在內存泄漏的問題,本篇將總結典型的內存泄漏的代碼,并給出對應的解決方案。內存泄漏的主要問題可以分為以下幾種類型:

  • 靜態變量引起的內存泄漏
  • 非靜態內部類引起的內存泄漏
  • 資源未關閉引起的內存泄漏

二、靜態變量引起的內存泄漏

在java中靜態變量的生命周期是在類加載時開始,類卸載時結束。換句話說,在android中其生命周期是在進程啟動時開始,進程死亡時結束。所以在程序的運行期間,如果進程沒有被殺死,靜態變量就會一直存在,不會被回收掉。如果靜態變量強引用了某個Activity中變量,那么這個Activity就同樣也不會被釋放,即便是該Activity執行了onDestroy(不要將執行onDestroy和被回收劃等號)。這類問題的解決方案為:1.尋找與該靜態變量生命周期差不多的替代對象。2.若找不到,將強引用方式改成弱引用。比較典型的例子如下:

單例引起的Context內存泄漏

public class IMManager {  private Context context;  private static IMManager mInstance;  public static IMManager getInstance(Context context) {    if (mInstance == null) {      synchronized (IMManager.class) {        if (mInstance == null)          mInstance = new IMManager(context);      }    }    return mInstance;  }  private IMManager(Context context) {    this.context = context;  }}

當調用getInstance時,如果傳入的context是Activity的context。只要這個單例沒有被釋放,這個Activity也不會被釋放。

解決方案
傳入Application的context,因為Application的context的生命周期比Activity長,可以理解為Application的context與單例的生命周期一樣長,傳入它是最合適的。

public class IMManager {  private Context context;  private static IMManager mInstance;  public static IMManager getInstance(Context context) {    if (mInstance == null) {      synchronized (IMManager.class) {        if (mInstance == null)          //將傳入的context轉換成Application的context          mInstance = new IMManager(context.getApplicationContext());      }    }    return mInstance;  }  private IMManager(Context context) {    this.context = context;  }}

三、非靜態內部類引起的內存泄漏

在java中,創建一個非靜態的內部類實例,就會引用它的外圍實例。如果這個非靜態內部類實例做了一些耗時的操作,就會造成外圍對象不會被回收,從而導致內存泄漏。這類問題的解決方案為:1.將內部類變成靜態內部類 2.如果有強引用Activity中的屬性,則將該屬性的引用方式改為弱引用。3.在業務允許的情況下,當Activity執行onDestory時,結束這些耗時任務。

內部線程造成的內存泄漏

public class LeakAty extends Activity {  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.aty_leak);    test();  }  public void test() {    //匿名內部類會引用其外圍實例LeakAty.this,所以會導致內存泄漏    new Thread(new Runnable() {      @Override      public void run() {        while (true) {          try {            Thread.sleep(1000);          } catch (InterruptedException e) {            e.printStackTrace();          }        }      }    }).start();  }  }

解決方案
將非靜態匿名內部類修改為靜態匿名內部類

public class LeakAty extends Activity {  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.aty_leak);    test();  }  //加上static,變成靜態匿名內部類  public static void test() {    new Thread(new Runnable() {      @Override      public void run() {        while (true) {          try {            Thread.sleep(1000);          } catch (InterruptedException e) {            e.printStackTrace();          }        }      }    }).start();  }}

Handler引起的內存泄漏

public class LeakAty extends Activity {  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.aty_leak);    fetchData();  }  private Handler mHandler = new Handler() {    public void handleMessage(android.os.Message msg) {      switch (msg.what) {      case 0:        // 刷新數據        break;      default:        break;      }    };  };  private void fetchData() {    //獲取數據    mHandler.sendEmptyMessage(0);  }}

mHandler 為匿名內部類實例,會引用外圍對象LeakAty.this,如果該Handler在Activity退出時依然還有消息需要處理,那么這個Activity就不會被回收。

解決方案

public class LeakAty extends Activity {  private TextView tvResult;  private MyHandler handler;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.aty_leak);    tvResult = (TextView) findViewById(R.id.tvResult);    handler = new MyHandler(this);    fetchData();  }  //第一步,將Handler改成靜態內部類。  private static class MyHandler extends Handler {    //第二步,將需要引用Activity的地方,改成弱引用。    private WeakReference<LeakAty> atyInstance;    public MyHandler(LeakAty aty) {      this.atyInstance = new WeakReference<LeakAty>(aty);    }    @Override    public void handleMessage(Message msg) {      super.handleMessage(msg);      LeakAty aty = atyInstance == null ? null : atyInstance.get();      //如果Activity被釋放回收了,則不處理這些消息      if (aty == null||aty.isFinishing()) {        return;      }      aty.tvResult.setText("fetch data success");    }  }  private void fetchData() {    // 獲取數據    handler.sendEmptyMessage(0);  }  @Override  protected void onDestroy() {    //第三步,在Activity退出的時候移除回調    super.onDestroy();    handler.removeCallbacksAndMessages(null);  }}

四、資源未關閉引起的內存泄漏

當使用了BraodcastReceiver、Cursor、Bitmap等資源時,當不需要使用時,需要及時釋放掉,若沒有釋放,則會引起內存泄漏。

綜上所述,內存泄漏的主要情況為上面的三大類型,最終歸結為一點,就是資源在不需要的時候沒有被釋放掉。所以在編碼的過程中要注意這些細節,提高程序的性能。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕在线看视频国产欧美| 精品久久久久久亚洲国产300| 日本精品久久电影| 久久综合电影一区| 国产精品视频自在线| 欧美一区二区视频97| 精品中文字幕在线2019| 欧美电影免费观看高清| 日韩在线视频导航| 国产精品视频一区二区三区四| 欧美激情一级精品国产| 欧美成人一二三| 国产成人综合精品在线| 亚洲精品456在线播放狼人| 国产精品jizz在线观看麻豆| 欧美乱人伦中文字幕在线| 97在线视频免费看| 久久国产精品首页| 国产日本欧美视频| 精品国产一区久久久| 欧美一级片一区| 97婷婷涩涩精品一区| 久久精品国产一区二区三区| 国产成人精品免高潮费视频| 国产精品久久久91| 亚洲人午夜精品免费| 欧洲精品久久久| 青青草国产精品一区二区| 91精品国产综合久久香蕉的用户体验| 日韩免费黄色av| 91亚洲精品久久久久久久久久久久| 欧美激情一区二区三区在线视频观看| 在线观看视频亚洲| 亚洲最新在线视频| 91亚洲午夜在线| 欧美影院在线播放| 国内精品久久久久影院 日本资源| 中文字幕欧美亚洲| 8x海外华人永久免费日韩内陆视频| 2023亚洲男人天堂| 欧美性理论片在线观看片免费| 久久久精品久久| 激情久久av一区av二区av三区| 亚洲第一福利网| 欧美激情视频在线观看| 午夜精品久久久久久久99黑人| 91最新在线免费观看| 91久久嫩草影院一区二区| 久久久亚洲国产天美传媒修理工| 热久久99这里有精品| 91精品国产免费久久久久久| 91国内产香蕉| 日韩在线视频国产| 国产精品96久久久久久| 亚洲欧美国产精品| 国产精品成人免费视频| 欧美猛男性生活免费| 国产精品视频不卡| 亚洲美女性生活视频| 欧美黄色三级网站| 国产美女直播视频一区| 欧美最猛性xxxxx(亚洲精品)| 欧美激情精品久久久久久久变态| 热久久美女精品天天吊色| 久久久免费电影| 国产精品久久久久久久久男| 欧美大全免费观看电视剧大泉洋| …久久精品99久久香蕉国产| 国产综合在线观看视频| 欧美成人黄色小视频| 亚洲一区二区中文字幕| 欧美电影电视剧在线观看| 精品五月天久久| 欧美天堂在线观看| 国产精品96久久久久久又黄又硬| 国产91对白在线播放| 久久影院资源站| 国产激情综合五月久久| 国产精品精品久久久| 国产精品永久在线| 中文字幕无线精品亚洲乱码一区| 久久久亚洲影院你懂的| 中国日韩欧美久久久久久久久| 日韩中文字幕精品| 日韩免费高清在线观看| 国产午夜精品免费一区二区三区| 亚洲另类激情图| 欧美精品久久一区二区| 国产精品最新在线观看| 韩国19禁主播vip福利视频| 欧美另类极品videosbestfree| 欧美高清性猛交| 91青草视频久久| 欧美性在线观看| 亚洲最大av在线| 欧美精品久久久久久久久| 国产精品a久久久久久| 欧美成在线观看| 成人女保姆的销魂服务| 高跟丝袜一区二区三区| 精品国产福利视频| www.欧美免费| 在线a欧美视频| 国产有码一区二区| 欧美日韩另类字幕中文| 亚洲影院污污.| 日本最新高清不卡中文字幕| 久久精品2019中文字幕| 久久五月天色综合| 久久中国妇女中文字幕| 欧美性极品少妇精品网站| 久久久午夜视频| 国产精品久久久久久久av电影| 日韩美女写真福利在线观看| 亚洲精品xxx| 精品亚洲一区二区三区在线播放| 亚洲在线观看视频| 亚洲国产精品免费| 国内精品久久久久久中文字幕| 日韩精品免费电影| 92看片淫黄大片欧美看国产片| 色视频www在线播放国产成人| 波霸ol色综合久久| 全色精品综合影院| 日日骚久久av| 久久露脸国产精品| 91九色单男在线观看| 日韩视频欧美视频| 国产精品久久久久久久av电影| 日韩av片免费在线观看| 欧美日韩国产专区| 日韩hd视频在线观看| 国产欧美日韩专区发布| 亚洲最大福利网站| 欧美最近摘花xxxx摘花| 欧美贵妇videos办公室| 中文字幕日韩免费视频| 国产精品入口尤物| 久久久久久com| 久久亚洲综合国产精品99麻豆精品福利| 欧美xxxx综合视频| 亚洲a中文字幕| 在线视频精品一| 日韩精品丝袜在线| 欧美成人精品在线视频| 亚洲午夜精品久久久久久性色| 91精品久久久久| 欧美性视频精品| 91国产视频在线播放| 国产精品日韩久久久久| 国产精品久久二区| 91干在线观看| 日韩av一区在线| 亚洲国产毛片完整版| 性夜试看影院91社区| 91精品国产91久久久久久| 2019中文字幕免费视频| 亚洲国产91色在线| 亚洲欧美在线免费观看| 性欧美视频videos6一9| 欧洲成人免费视频| 美女国内精品自产拍在线播放| 日韩精品中文字幕在线播放| 自拍偷拍亚洲一区|