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

談一談Android內(nèi)存泄漏問題

 更新時(shí)間:2016年01月29日 08:35:18   作者:_Hi_xiaoyu  
談一談Android內(nèi)存泄漏問題,圍繞內(nèi)存泄露的定義、內(nèi)存泄露的原理、內(nèi)存泄露的解決方法進(jìn)行探討,感興趣的小伙伴們可以參考一下

內(nèi)存泄漏:是指內(nèi)存得不到GC的及時(shí)回收,從而造成內(nèi)存占用過多,從而導(dǎo)致程序Crash,也就是常說的OOM。
一、static
先來看下面一段代碼

public class DBHelper {

  private static DBHelper db= null;

  private DBHelper() {

  }

  public static DBHelper getInstance(Context context) {
    if (bitmapUtils == null) {
      synchronized (DBHelper.class) {
        if (db== null) {
          db= new db(context,DBNAME);

        }
      }
    }
    return db;
  }
}

這樣的代碼在項(xiàng)目中很常見,如果大家仔細(xì)一點(diǎn),應(yīng)該能發(fā)現(xiàn)問題在那里。helper中持有了context的應(yīng)用,而DBHelper是全局的,也就是說,當(dāng)在一個(gè)Activity中使用了DBHelper,即使這個(gè)Activity退出了,這個(gè)Activity也沒法被GC回收,從而造成Activity一直駐留在內(nèi)存中。
這個(gè)解決方案也比較簡(jiǎn)單,代碼如下

public class DBHelper {

  private static DBHelper db= null;

  private DBHelper() {

  }

  public static DBHelper getInstance(Context context) {
    if (bitmapUtils == null) {
      synchronized (DBHelper.class) {
        if (db== null) {
          db= new db(context.getApplicationContext(),DBNAME);

        }
      }
    }
    return db;
  }
}

只需要把context改成ApplicationContext()即可,因?yàn)锳pplicationContext本身就是全局的。
二、非靜態(tài)內(nèi)部類、Handler
先來看一段代碼

  private Handler handler = new Handler(){
    @Override
    public void dispatchMessage(Message msg) {
      // 消息處理
    }
  };

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new Thread(new Runnable() {

      @Override
      public void run() {
        // 耗時(shí)操作
        handler.sendEmptyMessage(1);
      }
    }).start();
  }

我們知道非靜態(tài)內(nèi)部類會(huì)持有外部類的引用,此時(shí)這里的Handler持有著外部Activity的引用,當(dāng)我們?cè)贏ctivity的內(nèi)部類中進(jìn)行異步耗時(shí)操作時(shí),我們的Activity如果此時(shí)被finish掉了,而異步任務(wù)沒有執(zhí)行結(jié)束,這就會(huì)導(dǎo)致我們的Activity對(duì)象不能及時(shí)的被GC回收,從而導(dǎo)致內(nèi)存問題。
這樣的問題解決起來也很簡(jiǎn)單

  • 不要在匿名內(nèi)部類中進(jìn)行異步操作
  • 使用靜態(tài)匿名內(nèi)部類

內(nèi)存問題大多數(shù)都是因?yàn)閷?duì)對(duì)象生命周期的不巧當(dāng)處理造成的,在使用某個(gè)對(duì)象時(shí),我們需要仔細(xì)研究對(duì)象的生命周期,當(dāng)處理一些占用內(nèi)存較大并且生命周期較長(zhǎng)的對(duì)象時(shí),應(yīng)用使用軟引用對(duì)其就行處理,及時(shí)關(guān)閉不使用的資源。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

最新評(píng)論

会东县| 保德县| 木兰县| 通化县| 慈利县| 宜宾市| 乌什县| 澳门| 阿鲁科尔沁旗| 滨海县| 平顶山市| 阿巴嘎旗| 浮梁县| 白玉县| 蓬安县| 招远市| 长沙县| 讷河市| 岫岩| 安丘市| 南皮县| 岳普湖县| 阿图什市| 叶城县| 大姚县| 蒙阴县| 土默特左旗| 宁安市| 清镇市| 沽源县| 三亚市| 柳河县| 新兴县| 呼伦贝尔市| 承德县| 舞阳县| 芦山县| 霸州市| 洞头县| 陆河县| 图木舒克市|