2013-07-13 6 views
22

私はこの問題を絶えず抱えており、何をするべきかわかりません。キャンバス:リサイクルされたビットマップを使用しようとしています。

私はthisライブラリを使用しました。切り取った画像を取得したら、静的変数に保存して次のアクティビティに移動します。私が次のアクティビティに着いたら、その静的変数を参照してビットマップを取得し、それを縮小しようとします。しかし、それは私にエラーを与える。

ここに私がやっていることがあります。 RecommendationInfoクラスの

public void buttonCropClick(View view) throws IOException 
{ 
    imageView.setDrawingCacheEnabled(true); 
    imageView.buildDrawingCache(true); 
    Snapshot.CroppedBitmap = imageView.getDrawingCache(true); 
    imageView.setDrawingCacheEnabled(false); 
    startActivity(new Intent(this,RecommendationInfo.class)); 
} 

、私はその後、私は次のアクティビティに参照する静的変数にこのビットマップを保存し、次の関数に渡し、次の行Snapshot.CroppedBitmap = imageView.getDrawingCache(true);内のビットマップを取得します。

public static Bitmap scaleDown(Bitmap realImage,boolean filter) { 

    float maxImageSize = HeightToSet; 
    float ratio = Math.min(
      (float) maxImageSize/realImage.getWidth(), 
      (float) maxImageSize/realImage.getHeight()); 
    int width = Math.round((float) ratio * realImage.getWidth()); 
    int height = Math.round((float) ratio * realImage.getHeight()); 

    // Error here 
    Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width,height, filter); 
    return newBitmap; 
} 

私はすでにbitmap.recycle()を呼び出してみました。この問題を解決するために何ができるのですか?ここに私のlogcatがあります。

07-14 03:09:43.713: E/AndroidRuntime(19653): FATAL EXCEPTION: main 
07-14 03:09:43.713: E/AndroidRuntime(19653): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email protected] 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.graphics.Canvas.throwIfRecycled(Canvas.java:955) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.graphics.Canvas.drawBitmap(Canvas.java:1012) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.graphics.Bitmap.createBitmap(Bitmap.java:462) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at com.example.Libraries.Snapshot.scaleDown(Snapshot.java:42) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at com.example.androidtestproject.RecommendationInfo.SetRecommendationValues(RecommendationInfo.java:195) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at com.example.androidtestproject.RecommendationInfo.access$5(RecommendationInfo.java:183) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at com.example.androidtestproject.RecommendationInfo$1.onClick(RecommendationInfo.java:154) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.view.View.performClick(View.java:2552) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.view.View$PerformClick.run(View.java:9229) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.os.Handler.handleCallback(Handler.java:587) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.os.Looper.loop(Looper.java:138) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.app.ActivityThread.main(ActivityThread.java:3701) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at java.lang.reflect.Method.invokeNative(Native Method) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at java.lang.reflect.Method.invoke(Method.java:507) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at dalvik.system.NativeStart.main(Native Method) 
07-14 03:09:45.515: E/TAG(20039): End of input at character 0 of 
+0

どのようなエラーが報告されましたか? – Alamri

+0

質問を更新しました。 – Mj1992

+0

あなたのビットマップがどこかでリサイクルされていることを確認してください。リサイクル後にビットマップを呼び出すことはできません。他のアクティビティを開始する前にビットマップをリサイクルしているかどうか確認してください。 – k0sh

答えて

37

静的変数に渡す前にビットマップをコピーします。

Snapshot.CroppedBitmap = Bitmap.createBitmap(imageView.getDrawingCache(true)); 

Snapshot.CroppedBitmap = imageView.getDrawingCache(true); 

もはや良い練習として、必要なときにImageViewのは、その描画キャッシュをリサイクルされていない可能性が非常に高いです。それをコピーすることで、ImageViewが破棄されたビットマップへの参照を保持します。自分で管理できるコピーを作成してください!

+0

thnx多くの男、あなたのソリューションは簡潔で正確です:) – Mj1992

+0

希望はそれを助けた。乾杯! – AStupidNoob

+0

ありがとう...助けてくれました... – Vamshi

3

あなたが最初のソースイメージをコピーする必要があります。

Bitmap bitmap = webview.getDrawingCache(); 
if (bitmap != null) { 
     Snapshot.CroppedBitmap.setImageBitmap(bitmap.copy(bitmap.getConfig(), false)); 
} 
  • 必ずしも同じエラーが結果として、ソースビットマップのコピーを作成しませんcreateBitmapを使用します。
+0

java.lang.IllegalStateException:リサイクルビットマップをコピーできません – joecizac

関連する問題