从WebView获取位图会导致OutOfMemory崩溃

Ole*_*sov 13 android bitmap webview android-canvas

我有一个自定义WebView,我想获得其内容的位图(包括屏幕外).我使用了这个代码,我从这里得到:

 public static Bitmap getBitmapFromWebviewV2(WebView webView) {
    webView.measure(View.MeasureSpec.makeMeasureSpec(
        View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    webView.layout(0, 0, webView.getMeasuredWidth(),
            webView.getMeasuredHeight());
    webView.setDrawingCacheEnabled(true);
    webView.buildDrawingCache();
    Bitmap bm = Bitmap.createBitmap(webView.getMeasuredWidth(),
            webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);

    Canvas bigcanvas = new Canvas(bm);
    Paint paint = new Paint();
    int iHeight = bm.getHeight();
    bigcanvas.drawBitmap(bm, 0, iHeight, paint);
    webView.draw(bigcanvas);
    return bm;
}
Run Code Online (Sandbox Code Playgroud)

当我放大很多时,它工作正常,在这种情况下我得到OutOfMemory Crash.我用相同的图片(略微缩放并缩放到最大值)测试了它,它的行为与我上面提到的相同.

我试图通过添加来解决这个问题

while(webView.canZoomOut()){
      webView.zoomOut();
}
Run Code Online (Sandbox Code Playgroud)

在一开始,但它根本没有帮助.

Ole*_*sov 0

好吧,我自己破解了这个。问题确实在于该函数Bitmap在缩小过程结束之前返回了路径,所以我不得不延迟它。

我合并了

Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                //bulk of my code
            }
        }, 1000);
Run Code Online (Sandbox Code Playgroud)

这迫使函数的结构从 更改public Bitmappublic void这是直接相关的线程。尽管我仍然需要修复一些小调整,但这种方法很有魅力