国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

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

2020-04-11 10:53:49
字體:
供稿:網(wǎng)友

內(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è)解決方案也比較簡單,代碼如下

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)存問題。
這樣的問題解決起來也很簡單

  • 不要在匿名內(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)存較大并且生命周期較長的對(duì)象時(shí),應(yīng)用使用軟引用對(duì)其就行處理,及時(shí)關(guān)閉不使用的資源。

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 利川市| 赞皇县| 保定市| 汉沽区| 古丈县| 白山市| 台东市| 桐乡市| 额济纳旗| 梅河口市| 大渡口区| 三明市| 静安区| 通海县| 大安市| 抚顺市| 新密市| 怀化市| 大姚县| 克东县| 太和县| 安义县| 福州市| 鄂托克旗| 图片| 鹤峰县| 锡林浩特市| 新密市| 乌鲁木齐市| 玉门市| 宜春市| 剑川县| 安图县| 梧州市| 东阿县| 鄂州市| 桂阳县| 南澳县| 湖南省| 抚远县| 陕西省|