2013-07-13 36 views
22

Tôi liên tục gặp sự cố này và tôi không biết phải làm gì với nó.Canvas: cố gắng sử dụng bitmap tái chế android

Tôi đã sử dụng thư viện this và khi tôi nhận được hình ảnh đã cắt, tôi lưu nó vào biến tĩnh và chuyển sang hoạt động tiếp theo. Khi tôi đến hoạt động tiếp theo, tôi tham chiếu biến tĩnh đó để lấy bitmap và cố gắng mở rộng nó. Nhưng nó cho tôi lỗi.

Đây là những gì tôi đang làm.

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

trong lớp RecommendationInfo, tôi nhận được bitmap trong dòng sau Snapshot.CroppedBitmap = imageView.getDrawingCache(true); sau đó tôi lưu bitmap này trong biến tĩnh mà tôi tham khảo trong hoạt động tiếp theo và vượt qua nó để các chức năng sau đây.

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

Tôi đã thử gọi bitmap.recycle(). Tại sao tôi nhận được vấn đề này tôi có thể làm gì để giải quyết nó? Đây là logcat của tôi.

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

Lỗi nào cung cấp cho bạn? – Alamri

+0

Tôi đã cập nhật câu hỏi, vui lòng kiểm tra – Mj1992

+0

bitmap của bạn được tái chế ở đâu đó, bạn không thể gọi bitmap sau khi bạn tái chế nó. vui lòng xem liệu bạn có tái chế bitmap hay không trước khi bắt đầu hoạt động khác. – k0sh

Trả lời

37

Sao chép bitmap trước khi chuyển cho bit tĩnh.

Snapshot.CroppedBitmap = imageView.getDrawingCache(true); 

để

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

Nó rất có khả năng rằng IMAGExem được tái chế bộ nhớ cache vẽ của nó khi không còn cần thiết như thực hành tốt. Bằng cách sao chép nó ra, bạn giữ một tham chiếu đến bitmap ImageView chuyển vào thùng rác. Chỉ cần tạo một bản sao của nó mà bạn có thể tự mình quản lý!

+0

thnx rất nhiều người đàn ông, giải pháp của bạn là ngắn gọn và chính xác :) – Mj1992

+0

Hy vọng nó đã giúp. Chúc mừng! – AStupidNoob

+0

Cảm ơn ... đã giúp tôi quá ... – Vamshi

3

Bạn cần phải sao chép các hình ảnh nguồn đầu tiên:

Bitmap bitmap = webview.getDrawingCache(); 
if (bitmap != null) { 
     Snapshot.CroppedBitmap.setImageBitmap(bitmap.copy(bitmap.getConfig(), false)); 
} 
  • Sử dụng createBitmap sẽ không nhất thiết phải tạo ra một bản sao của bitmap nguồn, dẫn đến các lỗi tương tự.
+0

java.lang.IllegalStateException: Không thể sao chép một bitmap tái chế – joecizac

Các vấn đề liên quan