9

我正在使用 viewpager 加载大约 50 个 webviews...所有 webviews 都加载到 assests 中,每个 weview 都有一个 HTML 页面,每个页面访问大约 70 个图像...当我滑动时,我的应用程序在大约 30 页后崩溃,可能是因为 webviews 仍然保留对 assests 文件夹中图像的引用......有没有办法释放 Viewpager 在那个特定时间没有使用的 webviews?

awesomePager.setAdapter(new AwesomePagerAdapter(this, webviewdata));

细节:

Android WebView Memory Leak when loading html file from Assets  
Failed adding to JNI local ref table (has 512 entries)
"Thread-375" prio=5 tid=15 RUNNABLE

在 viewpager 上动态加载 webview

日志猫: 在此处输入图像描述

4

3 回答 3

1

尝试缩小位图。大多数情况下,位图是我们遇到内存问题的主要原因。还了解如何回收位图。以下代码段将为您提供帮助。

BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile( filename, options );
        options.inJustDecodeBounds = false;
        options.inSampleSize = 2; 

        bitmap = BitmapFactory.decodeFile( filename, options );
        if ( bitmap != null && exact ) {
            bitmap = Bitmap.createScaledBitmap( bitmap, width, height, false );
        }

还要确保您确实覆盖了以下方法。

@Override
public void destroyItem(View collection, int position, Object view) {
    ((ViewPager) collection).removeView((TextView) view);
}

或者你可以创建一个函数来缩小位图

private byte[] resizeImage( byte[] input ) {

    if ( input == null ) {
        return null;
    }

    Bitmap bitmapOrg = BitmapFactory.decodeByteArray(input, 0, input.length);

    if ( bitmapOrg == null ) {
        return null;
    }

    int height = bitmapOrg.getHeight();
    int width = bitmapOrg.getWidth();
    int newHeight = 250;

    float scaleHeight = ((float) newHeight) / height;

    // creates matrix for the manipulation
    Matrix matrix = new Matrix();
    // resize the bit map
    matrix.postScale(scaleHeight, scaleHeight);

    // recreate the new Bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0,
            width, height, matrix, true);

    bitmapOrg.recycle();

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    resizedBitmap.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos);            

    resizedBitmap.recycle();

    return bos.toByteArray();            
}       
于 2012-06-08T04:19:46.407 回答
0

WebView 与 JNI 一起使用,它只能容纳 512 个本地引用,尝试直接从 Web 加载您的内容,问题应该不会发生。

当我shouldInterceptRequest(WebView view, String url)webviewclient中覆盖并从我自己的缓存机制中传递本地引用时,我遇到了这个问题。

这可能是 webview 本身的错误。如果你问我,至少它不是应该如何表现的。

于 2012-09-10T07:11:34.250 回答
0

将 webview 的图层类型设置为软件有效。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

但是现在你失去了硬件加速,你的 webview 可能会变慢。

于 2016-09-09T15:54:24.643 回答