9

ビューページャーを使用して約50のWebビューをロードしています...すべてのWebビューがアセットにロードされ、各Webビューにはそれぞれ約70の画像にアクセスするHTMLページがあります...スワイプすると、約30ページ後にアプリがクラッシュします、Webビューのcosは、assestsフォルダー内の画像への参照を保持している可能性があります...その特定の時間にViewpagerが使用していないWebビューを解放する方法はありますか?

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を動的にロードしている間

Logcat: ここに画像の説明を入力してください

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 から直接ロードしてみてください。問題は発生しません。

webviewclientshouldInterceptRequest(WebView view, String url)をオーバーライドして、独自のキャッシュ メカニズムからローカル参照を渡すと、この問題が発生します。

これは、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);
}

しかし、ハードウェア アクセラレーションが失われ、Web ビューが遅くなる可能性があります。

于 2016-09-09T15:54:24.643 に答える