2012-06-08 93 views
9

我使用viewpager來加載大約50個網頁瀏覽...所有網頁瀏覽都加載到了assests中,每個weview都有一個HTML頁面,每個頁面訪問大約70個圖像...當我滑動時,我的應用程序在大約30頁後崩潰,可能是因爲webviews仍然保留對引用文件夾中圖像的引用......是否有任何方法可以釋放Viewpager在特定時間未使用的Web視圖?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: enter image description here

回答

1

嘗試縮放時間位圖的下降bitmap.Most是一個主要的原因,我們得到內存問題。 同時瞭解如何回收位圖。 以下代碼將幫助您。

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

感謝您的soln,但上面的問題是爲webview! –

+1

@Vipul是的,我已覆蓋destroyItem,仍然沒有運氣。 – Kiran

0

web視圖的工作原理與JNI,這隻能容納512個本地引用,請嘗試直接從網頁加載的內容和問題不該不會發生。

我得到這個問題,當我覆蓋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); 
} 

但是現在你失去了硬件加速,你的webview可能會放慢速度。