2017-08-09 17 views
11

Özel bir WebView sahibiyim ve içeriğinin bitmapini almak istiyorum (ekran dahil). Ben bu durumda ben OutOfMemory Crash olsun, bir sürü yakınlaştırmak zaman noktaya kadar iyi çalışırWebView'den Bitmap Alma, OutOfMemory çökmesini üretir

public static Bitmap getBitmapFromWebviewV2(WebView webView) { 
    webView.measure(View.MeasureSpec.makeMeasureSpec(
     View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED), 
     View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
    webView.layout(0, 0, webView.getMeasuredWidth(), 
      webView.getMeasuredHeight()); 
    webView.setDrawingCacheEnabled(true); 
    webView.buildDrawingCache(); 
    Bitmap bm = Bitmap.createBitmap(webView.getMeasuredWidth(), 
      webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 

    Canvas bigcanvas = new Canvas(bm); 
    Paint paint = new Paint(); 
    int iHeight = bm.getHeight(); 
    bigcanvas.drawBitmap(bm, 0, iHeight, paint); 
    webView.draw(bigcanvas); 
    return bm; 
} 

: Ben here aldığım bu kodu, kullandı. Bunu aynı resim ile test ettim (biraz yakınlaştırılmış ve maksimuma yakınlaştırılmış) ve yukarıda bahsettiğim gibi davranıyor.

ben başında

while(webView.canZoomOut()){ 
     webView.zoomOut(); 
} 

ekleyerek bunu karşı koymaya çalıştıklarını, ama hiç yardımcı olmuyor.

+0

Hızlı çözüm - Sen android ekleyebilirsiniz: largeHeap = "true" manifest dosyasında daha bellek için. –

+2

Çoğu zaman işe yaramayacak kötü bir geçici çözüm ... Sadece OOM istisnasını – MarkySmarky

+0

benim için çok geciktirecek, çok büyük bir bitmap elde etmek için gittiğiniz belli. Uygulamanızda sonsuz bellek elde edemezsin. –

cevap

0

Tamam, ben bunu kendi kendime kırdım. Sorun aslında fonksiyonun Bitmap waay'i uzaklaştırma prosedürü bitmeden önce döndürmesiydi, bu yüzden geciktirmek zorunda kaldım.

I public Bitmap den public void işlev yapısını değiştirmek zorunda
Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       //bulk of my code 
      } 
     }, 1000); 

dahil. Here's directly related thread. Hala düzeltmek gerekir bazı ufak tefek ayarlamalarla rağmen yaklaşım çekicilik

+0

Peki, neden “WebView” un orijinal boyutlarını yakınlaştırmadan ve “Bitmap” için hedef boyutları olarak orijinal boyutlarını kullanarak “Bitmap.createScaledBitmap()” işlevini kullanmıyorsunuz? –

+0

@Oleksandr Firsov, işleyiciyi kullanarak hiç bellek yetersiz kalmadınız. –

+0

@Chestan Joshi Nope, farklı görüntüler ve hatalarla birkaç kez test etti. –

-1

Hızlı çözüm gibi çalışır: -

Set android: largeHeap AndroidManifest.xml dosyasında = "true".

<application 
    android:name="yourapplication" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher_rounded" 
    android:label="@string/app_name" 
    android:largeHeap="true" 
    android:roundIcon="@mipmap/ic_launcher_rounded" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

Gud şans :)

+0

Bu bayrak genellikle göz ardı edilir ve büyük yığın durumunda bile, bir bitmap oluştururken OOM alma olasılığınız vardır. – Dimezis

İlgili konular