在調試一個android APP時,重複的調用創建一個webview Activity,盯着android studio 的 Android Profiler看,發現Memery佔用從300M慢慢的疊加到了1個G,最後發生GC強制回收內存,屏幕閃爍一下後,App自動重啓回到主頁界面。
一開始以爲是WebView未釋放內存的原因,就去找了釋放WebView內存的方法。有說法webview在佈局文件內配置,內存是無法主動釋放的。webView的推薦配置是動態生成,Activity銷燬時主動釋放內存。
private RelativeLayout mywebLayout;
private WebView web;
@Override
protected void onCreate(Bundle savedInstanceState) {
mywebLayout = (RelativeLayout) findViewById(R.id.mywebLayout);
web = new WebView(this);
web.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
mywebLayout.addView(web);
}
@Override
public void onDestroy() {
super.onDestroy();
mywebLayout.removeView(web);
web.removeAllViews();
web.destroy();
}
然後我發現自己後來又踩了個坑:
WebView Activity 在註冊表裏配置爲singTask單例模式, 在WebView Activity內聲明變量private WebView web,在動態生成webview時又聲明瞭一次
WebView web = new WebView(this);
導致每次生成一個新的WebView對象,原有的WebView對象永遠無法釋放,導致內存爆炸