2017-08-09 2 views
11

Ich habe eine benutzerdefinierte WebView und ich möchte eine Bitmap des Inhalts (Offscreen enthalten). Ich habe diesen Code, die ich von here bekam:Get Bitmap von WebView generiert OutOfMemory Absturz

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

Es fein bis zu dem Punkt funktioniert, wenn ich in einem viel zoomen, wobei in diesem Fall ich OutOfMemory Absturz zu bekommen. Ich habe das mit dem gleichen Bild getestet (leicht gezoomt und auf das Maximum gezoomt) und es verhält sich genauso, wie ich oben erwähnt habe.

ich versuchte, dies zu begegnen, indem sie

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

am Anfang hinzufügen, aber es überhaupt nicht helfen.

+0

Schnell Abhilfe - Sie können android hinzufügen: largeHeap = "true" in-Manifest-Datei für mehr Speicher. –

+2

fieser Workaround, der die meiste Zeit nicht funktioniert .... es wird nur Ihre OOM Ausnahme – MarkySmarky

+0

verzögern für mich ist es offensichtlich, dass Sie wan, um zu große Bitmap bekommen. Sie können in Ihrer App keinen unbegrenzten Speicher abrufen. –

Antwort

0

Okay, ich habe dieses selbst geknackt. Das Problem war in der Tat, dass die Funktion die Bitmap Waay zurückgab, bevor das Herauszoomen beendet war, also musste ich es verzögern.

I eingearbeitet

Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       //bulk of my code 
      } 
     }, 1000); 

, die die Struktur der Funktion aus public Bitmap zu public void ändern gezwungen. Here's directly related thread. Trotz einiger kleineren Verbesserungen noch zu beheben ich brauche, funktioniert der Ansatz wie ein Zauber

+0

Also, warum erhalten Sie nicht direkt die ursprünglichen Dimensionen Ihrer 'WebView' bevor sie vergrößert wird und' Bitmap.createScaledBitmap() 'verwendet, wobei die ursprünglichen Dimensionen als Zieldimensionen für die' Bitmap' verwendet werden? –

+0

@Oleksandr Firsov, sind Sie sicher, dass Sie keinen Speicher durch Verwendung von Handler erhalten haben. –

+0

@Chestan Joshi Nope, testete es einige Male mit verschiedenen Bildern und keine Fehler. –

-1

Quick Fix: -

Set android: largeHeap = "true" in AndroidManifest.xml Datei.

<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 Glück :)

+0

Dieses Flag wird oft ignoriert und selbst bei einem großen Heap haben Sie immer noch die Möglichkeit, OOM beim Erstellen einer Bitmap zu erhalten. – Dimezis

Verwandte Themen