2012-05-24 6 views
6

Ứng dụng của tôi có mã này đoạn mãLàm thế nào để tránh con trỏ null trong View.getDrawingCache()?

mView.setDrawingCacheEnabled(true); 
mBitmap = Bitmap.createBitmap(mView.getDrawingCache()); 

đâu mView là một thể hiện của một lớp con tùy chỉnh của FrameLayout. Ứng dụng này đã hoạt động tốt trong 6 tháng nay với hàng nghìn người dùng. Gần đây tôi có vài báo cáo (có thể từ cùng một người dùng nhưng tôi không thể xác nhận) về một con trỏ null được chuyển tới createBitmap(). Tôi không biết phiên bản phần cứng hoặc phiên bản Android nào người dùng sử dụng.

Điều gì có thể khiến getDrawingCache() trả lại giá trị mặc dù tôi đã bật bộ nhớ cache ngay trước nó? Có liên quan đến tăng tốc phần cứng trong điện thoại mới không? Có phải vì ram không đủ cho bitmap? Còn gì nữa không? Nó có thể được ngăn ngừa không?

Chỉnh sửa: Tôi tìm thấy giải pháp này tại đây http://tinyurl.com/7yranvj. Đây có phải là cách giải quyết hợp lý không?

mBitmap = Bitmap.createBitmap(mView.getWidth(), mView.getHeight(), 
     Bitmap.Config.ARGB_8888); 
final Canvas canvas = new Canvas(mBitMap); 
mView.draw(canvas); 

Trả lời

0

thực sự là dự đoán của bạn là đúng. Nếu bạn đang sử dụng lớp tăng tốc phần cứng, bạn không thể sử dụng bộ nhớ cache của bản vẽ. Các thiết bị mới có tăng tốc phần cứng theo mặc định, vì vậy nó có thể là vấn đề của bạn. bạn có thể tắt tăng tốc phần cứng cho chế độ xem đơn như thế này.

if(android.os.Build.VERSION.SDK_INT >= 11) frame.setLayerType(LAYER_TYPE_SOFTWARE, null); 
frame.setDrawingCacheEnabled(true);