談一談Android內(nèi)存泄漏問(wè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í)有所幫助。
- Android 內(nèi)存溢出和內(nèi)存泄漏的問(wèn)題
- 5個(gè)Android開(kāi)發(fā)中比較常見(jiàn)的內(nèi)存泄漏問(wèn)題及解決辦法
- 詳解Android內(nèi)存泄漏檢測(cè)與MAT使用
- 詳解Android性能優(yōu)化之內(nèi)存泄漏
- Android開(kāi)發(fā):淺談MVP模式應(yīng)用與內(nèi)存泄漏問(wèn)題解決
- Android 有效的解決內(nèi)存泄漏的問(wèn)題實(shí)例詳解
- Android內(nèi)存泄漏實(shí)戰(zhàn)解析
- Android 內(nèi)存泄漏的幾種可能總結(jié)
- 分析Android內(nèi)存泄漏的幾種可能
- Android常見(jiàn)的幾種內(nèi)存泄漏小結(jié)
相關(guān)文章
Android編程雙重單選對(duì)話框布局實(shí)現(xiàn)與事件監(jiān)聽(tīng)方法示例
這篇文章主要介紹了Android編程雙重單選對(duì)話框布局實(shí)現(xiàn)與事件監(jiān)聽(tīng)方法,涉及Android雙重單選對(duì)話框的界面布局與事件監(jiān)聽(tīng)、響應(yīng)等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Android APP之WebView校驗(yàn)SSL證書(shū)的方法
這篇文章主要介紹了Android APP之WebView校驗(yàn)SSL證書(shū)的方法,需要的朋友可以參考下2017-09-09
android?studio?項(xiàng)目?:UI設(shè)計(jì)高精度實(shí)現(xiàn)簡(jiǎn)單計(jì)算器
這篇文章主要介紹了android?studio?項(xiàng)目?:UI設(shè)計(jì)高精度實(shí)現(xiàn)簡(jiǎn)單計(jì)算器,自主完成一個(gè)簡(jiǎn)單APP的設(shè)計(jì)工作,綜合應(yīng)用已經(jīng)學(xué)到的Android?UI設(shè)計(jì)技巧,下面來(lái)看看實(shí)驗(yàn)實(shí)現(xiàn)過(guò)程2021-12-12
Android使用KeyStore對(duì)數(shù)據(jù)進(jìn)行加密的示例代碼
這篇文章主要介紹了Android使用KeyStore對(duì)數(shù)據(jù)進(jìn)行加密的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
Android中封裝RecyclerView實(shí)現(xiàn)添加頭部和底部示例代碼
這篇文章主要給大家介紹了關(guān)于Android中封裝RecyclerView實(shí)現(xiàn)添加頭部和底部的相關(guān)資料,網(wǎng)上這方面的資料很多,但都不是自己需要的,索性自己寫(xiě)一個(gè)分享出來(lái)供大家參考學(xué)習(xí),需要的朋友們下面隨著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
Android動(dòng)畫(huà)系列之幀動(dòng)畫(huà)和補(bǔ)間動(dòng)畫(huà)的示例代碼
Android 提供三種動(dòng)畫(huà):幀動(dòng)畫(huà)、補(bǔ)間動(dòng)畫(huà)和屬性動(dòng)畫(huà),本篇文章介紹幀動(dòng)畫(huà)以及補(bǔ)間動(dòng)畫(huà)的使用,屬性動(dòng)畫(huà)的使用將在后面的文章中分享,那就來(lái)復(fù)習(xí)一下這兩種動(dòng)畫(huà)的使用吧2020-09-09
Android系統(tǒng)進(jìn)程間通信(IPC)機(jī)制Binder中的Server和Client獲得Service Manager接
本文主要介紹Android IPC通信Binder中的Server和Client獲得Service Manager接口,這里詳細(xì)的說(shuō)明了如何實(shí)現(xiàn)Service Manager接口,對(duì)研究Android源碼的朋友提供幫助,有需要的小伙伴可以參考下2016-08-08
Android模擬實(shí)現(xiàn)支付寶螞蟻森林效果
這篇文章主要為大家詳細(xì)介紹了如何利用Android模擬實(shí)現(xiàn)支付寶中螞蟻森林的動(dòng)畫(huà)效果,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-09-09

