2017-08-09 8 views
11

私はカスタムWebViewを持っており、その内容(オフスクリーンを含む)のビットマップを取得したいと考えています。私は、その場合には、私はのOutOfMemoryクラッシュを取得し、多くに拡大するとそれはポイントまで正常に動作しますWebViewからビットマップを取得するとOutOfMemoryクラッシュが発生する

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

:私はhereからもらったこのコードを、使用していました。私はこれを同じ画像(わずかにズームして最大にズームしたもの)でテストしましたが、これは上記と同じように動作します。

私は開始時に

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

を追加することでこれに対抗しようとしたが、それは全く役に立ちません。

+0

クイック回避策。 –

+2

ほとんどの時にうまくいかない厄介な回避策.... OOM例外を遅らせるだけです – MarkySmarky

+0

私にとっては、大きすぎるビットマップを取得することは明らかです。あなたのアプリで無限の記憶を得ることはできません。 –

答えて

0

さて、私はこの1つのmeselfをクラックしました。この問題は実際には、ズームアウトプロシージャが終了する前に関数がBitmapウェイを返したため、遅延させる必要がありました。

私はpublic Bitmapからpublic voidに機能の構造を変更することを余儀なくさ

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

を組み込みます。 Here's directly related thread。私はまだ修正する必要があるいくつかのマイナーな改良にもかかわらず、アプローチが魅力

+0

それで、あなたが 'WebView'の元のサイズをズームインする前に直接取得せずに、' Bitmap.createScaledBitmap() 'を使って、元の寸法を' Bitmap'の目標寸法として使用してみませんか? –

+0

@Oleksandr Firsov、ハンドラを使用してメモリが不足していないことを確認してください。 –

+0

@Chestan Joshi Nopeは、さまざまな画像とエラーなしで数回テストしました。 –

-1

クイックフィックスのように動作します: -

設定しアンドロイド:largeHeapあなたのAndroidManifest.xmlファイル内=「true」を。 largeHeapは= "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運:)

+0

このフラグは無視されることが多く、ヒープが大きい場合でもビットマップ作成時にOOMを取得する可能性があります。 – Dimezis

関連する問題