WebView的内存泄漏处理方式有两种,分别是开启独立的web进程、不在xml里面声明,而是直接代码new个对象,传入application context防止activity引用滥用,并反射回收
第一、开启独立的web进程
1.1 在manifest配置如下:
<activity
android:name="com.example.demo.WebActivity"
android:process=":remote" >
</activity>
1.2 在关闭Activity时销毁进程
protected void onDestroy() {
super.onDestroy();
//setConfigCallback(null);
}
1.3 缺点:这种方式涉及到进程间的通信,不方便处理,可以通过AIDL解决
第二、不在xml里面声明,而是直接代码new个对象
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WindowManager windowManager = (WindowManager) getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE);
setConfigCallback(windowManager);
LinearLayout linearLayout = new LinearLayout(getApplicationContext());
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
linearLayout.setLayoutParams(layoutParams);
WebView webView = new WebView(getApplicationContext());
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
webView.loadUrl("https://www.baidu.com/");
linearLayout.addView(webView);
setContentView(linearLayout);
}
/**
* 通过反射来释放内存
*
* @param windowManager
*/
public void setConfigCallback(WindowManager windowManager) {
try {
Field field = WebView.class.getDeclaredField("mWebViewCore");
field = field.getType().getDeclaredField("mBrowserFrame");
field = field.getType().getDeclaredField("sConfigCallback");
field.setAccessible(true);
Object configCallback = field.get(null);
if (null == configCallback) {
return;
}
field = field.getType().getDeclaredField("mWindowManager");
field.setAccessible(true);
field.set(configCallback, windowManager);
} catch (Exception e) {
}
}