這里轉(zhuǎn)載了一款文章箱歧,點(diǎn)擊觀看。詳細(xì)的介紹了日常開(kāi)發(fā)中經(jīng)常使用的一些單例一膨,線程呀邢,Handler一類的OOM的防止和處理。
1.單例產(chǎn)生的內(nèi)存溢出
2.handler產(chǎn)生的內(nèi)存溢出
3.線程造成的內(nèi)存溢出豹绪。AsyncTask
4.非靜態(tài)內(nèi)部類創(chuàng)建靜態(tài)實(shí)例內(nèi)存溢出价淌。對(duì)外部的一個(gè)引用。
5.webview
6.資源未關(guān)閉。
webview的解決方案:
其中一種就是使用getApplicationgContext作為參數(shù)構(gòu)建WebView蝉衣,然后動(dòng)態(tài)添加到一個(gè)ViewGroup中豺型,最后退出的時(shí)候調(diào)用webView的銷毀的函數(shù),雖然也達(dá)到了防止內(nèi)存溢出的效果买乃,但是在有些網(wǎng)頁(yè)彈出時(shí)候需要記住密碼的對(duì)話框的時(shí)候姻氨,會(huì)出現(xiàn)Unable to add window -- token null is not for an application 的錯(cuò)誤,所以這里采用的解決辦法是通過(guò)把使用了WebView的Activity(或者Service)放在單獨(dú)的進(jìn)程里剪验。然后在檢測(cè)到應(yīng)用占用內(nèi)存過(guò)大有可能被系統(tǒng)干掉或者它所在的Activity(或者Service)結(jié)束后肴焊,調(diào)用android.os.Process.killProcess(android.os.Process.myPid());,主動(dòng)Kill掉進(jìn)程功戚。由于系統(tǒng)的內(nèi)存分配是以進(jìn)程為準(zhǔn)的娶眷,進(jìn)程關(guān)閉后,系統(tǒng)會(huì)自動(dòng)回收所有內(nèi)存啸臀。
public class MainActivity5 extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_web);
mWebView = (WebView) findViewById(R.id.web);
mWebView.loadUrl(
"http://www.cnblogs.com/whoislcj/p/5720202.html");
}
@Override
protected void onDestroy() {
destroyWebView();
android.os.Process.killProcess(android.os.Process.myPid());
super .onDestroy();
}
private void destroyWebView() {
if (mWebView != null ) {
mWebView.pauseTimers();
mWebView.removeAllViews();
mWebView.destroy();
mWebView = null ;
}
}
}