欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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)目中很常見(jiàn),如果大家仔細(xì)一點(diǎn),應(yīng)該能發(fā)現(xiàn)問(wèn)題在那里。helper中持有了context的應(yīng)用,而DBHelper是全局的,也就是說(shuō),當(dāng)在一個(gè)Activity中使用了DBHelper,即使這個(gè)Activity退出了,這個(gè)Activity也沒(méi)法被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)部類(lèi)、Handler
先來(lái)看一段代碼

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

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

內(nèi)存問(wèn)題大多數(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)論