Android WebView内存泄漏

Android WebView内存泄漏,android,memory-leaks,webview,Android,Memory Leaks,Webview,我们在一个设备上有一个WebView,它可以加载10个页面,其中包含一些javascript。 问题是它在漏水,我不知道它是从哪里来的。 基本上,有一个活动具有ViewPager,并且该ViewPager启用了.setAdapter 新的网络适配器。WebPageAdapter扩展了PagerAdapter 问题是,这是泄漏的地方,我们尝试的一切都不起作用。它看起来像是在一台设备上,RAM的使用量不断地在5-10mb之间跳跃,但一直在增加,一天之后,它的使用量就达到了150MB。 堆转储没有显示

我们在一个设备上有一个WebView,它可以加载10个页面,其中包含一些javascript。 问题是它在漏水,我不知道它是从哪里来的。 基本上,有一个活动具有ViewPager,并且该ViewPager启用了.setAdapter 新的网络适配器。WebPageAdapter扩展了PagerAdapter

问题是,这是泄漏的地方,我们尝试的一切都不起作用。它看起来像是在一台设备上,RAM的使用量不断地在5-10mb之间跳跃,但一直在增加,一天之后,它的使用量就达到了150MB。 堆转储没有显示任何有用的内容,而dumpsys meminfo在对象下显示越来越多的视图? 我不知道该试什么了,有什么建议吗

这是Web适配器上的instatiateItem

@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来查找内存泄漏,那么就会找到它。您只需要更深入地了解这些工具。