2012-06-08 10 views
9

私は約50のWebviewsを読み込むためにビューページを使用しています...すべてのwebviewsはassestsに読み込まれ、各weviewは約70のイメージにアクセスしているHTMLページを持っています...私は、アプリは約30ページ後にクラッシュしているかもしれませんが、webviewsがまだassestsフォルダ内の画像への参照を保持している可能性があります...その特定の時間にViewpagerが使用していないwebviewsをリリースする方法はありますか?Viewpager Webviewメモリの問題

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:タイムビットマップのbitmap.Mostを縮小する enter image description here

答えて

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); 
} 

それとも、WebViewのは、JNIで動作し、これが唯一のウェブと問題shouldnから直接コンテンツをロードしようと、512のローカル参照を保持することができますビットマップ

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();    
}  
+1

あなたのご協力ありがとうございますが、上記の質問はwebviewです! –

+1

@Vipulはい、私はdestroyItemをオーバーライドしましたが、まだ運がありません。 – Kiran

0

を縮小する関数を作成することができます起こらない。

shouldInterceptRequest(WebView view, String url)webviewclientに上書きし、自分のキャッシュメカニズムからローカル参照を渡すと、この問題が発生します。

これはwebview自体のバグかもしれません。あなたが私に尋ねるならば、少なくともそれはどのように行動するべきではありません。

0

webviewのレイヤータイプをソフトウェアに設定します。

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

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