Android WebView内存泄漏
我们在一个设备上有一个WebView,它可以加载10个页面,其中包含一些javascript。 问题是它在漏水,我不知道它是从哪里来的。 基本上,有一个活动具有ViewPager,并且该ViewPager启用了.setAdapter 新的网络适配器。WebPageAdapter扩展了PagerAdapter 问题是,这是泄漏的地方,我们尝试的一切都不起作用。它看起来像是在一台设备上,RAM的使用量不断地在5-10mb之间跳跃,但一直在增加,一天之后,它的使用量就达到了150MB。 堆转储没有显示任何有用的内容,而dumpsys meminfo在对象下显示越来越多的视图? 我不知道该试什么了,有什么建议吗 这是Web适配器上的instatiateItemAndroid WebView内存泄漏,android,memory-leaks,webview,Android,Memory Leaks,Webview,我们在一个设备上有一个WebView,它可以加载10个页面,其中包含一些javascript。 问题是它在漏水,我不知道它是从哪里来的。 基本上,有一个活动具有ViewPager,并且该ViewPager启用了.setAdapter 新的网络适配器。WebPageAdapter扩展了PagerAdapter 问题是,这是泄漏的地方,我们尝试的一切都不起作用。它看起来像是在一台设备上,RAM的使用量不断地在5-10mb之间跳跃,但一直在增加,一天之后,它的使用量就达到了150MB。 堆转储没有显示
@Override
public Object instantiateItem(ViewGroup container, int position) {
NonLeakingWebView mwebView = new NonLeakingWebView(activity.getApplicationContext());
if (mWebViewClientLogScreen == null)
mWebViewClientLogScreen = new WebViewClientLogScreen(activity);
mwebView.setWebViewClient(mWebViewClientLogScreen);
mwebView.clearCache(true);
mwebView.setWebChromeClient(new WebChromeClient());
if (pos >= lenght)
pos = 0;
mwebView.getSettings().setJavaScriptEnabled(true);
mwebView.setTag(String.valueOf(pos));
mwebView.loadUrl(imageArray[pos]);
++pos;
// view.addView(mwebView);
container.addView(mwebView, 0);
return mwebView;
}
NonLeakingWebView是来自的WebView
销毁物品
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
try {
NonLeakingWebView mWebView = (NonLeakingWebView) object;
container.removeView(mWebView);
mWebView.removeAllViews();
mWebView.clearHistory();
mWebView.clearView();
mWebView.clearCache(true);
mWebView.freeMemory();
mWebView.destroy();
Class.forName("android.webkit.WebView").getMethod("onPause", (Class[]) null).invoke(mWebView, (Object[]) null);
mWebView = null;
System.gc();
} catch (Exception e) {
e.printStackTrace();
}
container.removeView((View) object);
}
有。onPause,因为我们试图暂停以查看是否有任何差异
public class NLAwebPager extends ViewPager {
public NLAwebPager(Context context) {
super(context);
}
public NLAwebPager(Context context, AttributeSet attr) {
super(context, attr);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
return true;
}
}
这是在主活动上执行此操作的自定义ViewPager
NLPager= (NLAwebPager) findViewById(R.id.frame);
NLPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
WebView mWebVIew = (WebView) NLPager.findViewWithTag(--arg0);
if (mWebVIew != null)
mWebVIew.onPause();
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// Log.e("ss", "s");
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
这是一个Runnable,每X秒更改一次适配器页面
private Runnable runnable_webPage = new Runnable() {
@Override
public void run() {
i = txtTime.getCurrentItem();
txtTime.setCurrentItem(++i, false);
mHandlerWebPage.removeCallbacks(runnable_webPage);
mHandlerWebPage.postDelayed(runnable_webPage, webPageChangeTimer);
}
};
以及用于进度条的自定义WebViewClient
public class WebViewClientLogScreen extends WebViewClient {
LogScreen wpa;
public WebViewClientLogScreen(FragmentActivity wpa) {
this.wpa = (LogScreen) wpa;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
try {
ProgressBar mbar = (ProgressBar) view.getTag();
mbar.setVisibility(View.GONE);
} catch (Exception e) {
}
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
try {
ProgressBar mbar = (ProgressBar) view.getTag();
mbar.setVisibility(View.VISIBLE);
} catch (Exception e) {
}
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
try {
wpa.doShowMessage();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
}您是否尝试过使用traceview?这里没有什么帮助,我认为您应该能够在本文之后跟踪内存泄漏,这不是一项容易的任务,但是如果您确实使用堆转储和MAT来查找内存泄漏,那么就会找到它。您只需要更深入地了解这些工具。