2013-07-13 2 views
22

계속이 문제가 발생하며 이에 대해 어떻게해야할지 모르겠습니다.캔버스 : 재활용 비트 맵을 사용하려고합니다. android

저는 this 라이브러리를 사용했습니다. 자른 이미지를 얻을 때 정적 변수에 저장하고 다음 활동으로 이동합니다. 다음 액티비티에 도착하면 정적 변수를 참조하여 비트 맵을 가져오고 크기를 조정합니다. 그러나 그것은 나에게 오류를 준다.

내가하고있는 일이 여기에있다.

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

RecommendationInfo 클래스, I는 난 다음 활동에 참조하고 다음의 함수로 전달 정적 변수에서이 비트 맵을 저장 한 다음 행 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 = imageView.getDrawingCache(true); 

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

에 더 이상 좋은 방법으로 필요 없을 때 이미지 뷰가 도면 캐시를 재활용한다 가능성이 높다. 복사하여 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

관련 문제