2012-06-08 15 views
9

Używam stron podglądu do załadowania około 50 wyświetleń strony ... Wszystkie wyświetlenia stron internetowych są ładowane do assestów, a każdy weview ma stronę HTML, która uzyskuje dostęp do około 70 obrazów każdego ... Jak przesunąć, mój Aplikacja zawiesza się po około 30 stronach, może być cos stron internetowych wciąż zachowują odniesienie do obrazów w folderze assests ... Czy jest jakiś sposób, aby zwolnić strony internetowe, których Viewpager nie używa w tym czasie?Viewpager Wyświetlenie pamięci z widokiem przeglądarki

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

Szczegóły:

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 

natomiast dynamicznie loading webview na viewpager

Logcat: enter image description here

Odpowiedz

1

Postaraj się skalować w dół bitmap.Most bitmapy czasu jest głównym powodem, dla którego uzyskać problem z pamięcią. Dowiedz się także, jak odtwarzać mapy bitowe. Poniższy fragment pomoże.

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

Upewnij się, że zastąpiłeś następującą metodę.

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

Lub można utworzyć funkcję zmniejszania Bitmap

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

dzięki za soln, ale powyżej pytanie jest za przeglądarkę internetową !!! –

+1

@Vipul Tak, mam nadpisane destroyItem, wciąż bez powodzenia. – Kiran

0

WebView współpracuje z JNI i może posiadać tylko 512 odnośników lokalne, wkładaj treści bezpośrednio z sieci i problem powinnam nie występują.

Otrzymuję ten problem, gdy przesłonię shouldInterceptRequest(WebView view, String url) w webviewclient i ręcznie lokalne odwołania z mojego własnego mechanizmu buforowania.

To może być błąd w samej przeglądarce. Przynajmniej nie tak powinno się zachowywać, jeśli mnie pytasz.

0

Ustawianie typu warstwy widoku internetowego na działające oprogramowanie.

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

Ale teraz tracisz akcelerację sprzętową i Twoja przeglądarka internetowa może zwolnić.

Powiązane problemy