2013-03-21 23 views
9

Ứng dụng của tôi là để hiển thị hình ảnh trong sau thời trang như thể hiện trong hình ảnhAndroid Bitmap.createScaledBitmap ném java.lang.OutOfMemoryError chủ yếu vào Jelly Bean 4.1 Mục đích chính

enter image description here

private void setSelectedImage(int selectedImagePosition) 
{ 

    BitmapDrawable bd = (BitmapDrawable) drawables.get(selectedImagePosition); 
    Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), (int) (bd.getIntrinsicHeight() * 0.9), (int) (bd.getIntrinsicWidth() * 0.7), false); 
    selectedImageView.setImageBitmap(b); 
    selectedImageView.setScaleType(ScaleType.FIT_XY); 

} 

đang Chi tiết có thể được tìm thấy here

ngoại lệ được ném vào dòng sau

Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), (int) (bd.getIntrinsicHeight() * 0.9), (int) (bd.getIntrinsicWidth() * 0.7), false); 

Chức năng trên được gọi từ onItemSelected. ** Các ứng dụng vẫn hoạt động tốt trên 2,2 và 2,3, nhưng ném ngoại lệ ngay lập tức trên 4.1 Trên mã hoạt động tốt, nhưng ném sau ngoại lệ. Tôi không thấy bất kỳ sự cố nào trong phiên bản 2.2 và 2.3, nhưng nó bị treo cứng trong 4.1 Có sự khác biệt lớn nào về quản lý bộ nhớ trong hạt Jelly không? **:

java.lang.OutOfMemoryError 
AndroidRuntime(2616): at android.graphics.Bitmap.nativeCreate(Native Method) 
AndroidRuntime(2616): at android.graphics.Bitmap.createBitmap(Bitmap.java:640) 
AndroidRuntime(2616): at android.graphics.Bitmap.createBitmap(Bitmap.java:586) 
AndroidRuntime(2616): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:466) 
AndroidRuntime(2616): at com.rdx.gallery.GalleryDemoActivity.setSelectedImage(GalleryDemoActivity.java:183) 
+0

Kích thước và chiều cao bitmap của bạn là bao nhiêu? –

+0

chiều rộng bitmap và chiều cao là 363X387 – RDX

+0

Tôi nghĩ rằng vấn đề được chọnImageView.setScaleType (ScaleType.FIT_XY); –

Trả lời

13

http://www.youtube.com/watch?v=_CruQY55HOk. Sau khi andorid, dữ liệu pixel bitmap 3.0 được lưu trữ trên heap. Có vẻ như bạn đang vượt quá kích thước bộ nhớ heap. Chỉ vì ứng dụng của bạn yêu cầu đống lớn không sử dụng đống lớn. Thêm kích thước của đống, bộ sưu tập rác thường xuyên hơn. Video có giải thích tốt về chủ đề.

Cũng tái chế các ảnh bitmap khi không sử dụng. Bộ sưu tập rác trên heap được thực hiện đánh dấu và quét của tôi, vì vậy khi bạn tái chế bitmap thì bộ nhớ của nó miễn phí. Vì vậy, kích thước heap của bạn sẽ không phát triển và hết bộ nhớ.

bitmap.recycle(); 

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html. Tài liệu về tải bitmap hiệu quả. Hãy xem tải phiên bản thu nhỏ trong bộ nhớ.

Ngoài biểu mẫu này, bạn có thể sử dụng Trình tải ảnh toàn cục. https://github.com/nostra13/Android-Universal-Image-Loader.

https://github.com/thest1/LazyList. Tải hình ảnh một cách lười biếng.

Cả hai đều sử dụng bộ nhớ đệm.

+0

sử dụng bitmap.recycle() không sử dụng acutally giúp. – RDX

+0

đã khắc phục được sự cố của bạn chưa ?? – Raghunandan

+0

Đã sử dụng bitmap.recycle cho bitmap không sử dụng. Hiện không có thêm sự cố nào trên mô-đun đó. Cảm ơn – RDX

4

Bạn đang cố gắng truy cập nhiều bộ nhớ hơn khi có. Cố gắng sử dụng

BitmapFactory.Options opts=new BitmapFactory.Options(); 
     opts.inDither=false;      
     opts.inSampleSize = 8;     
     opts.inPurgeable=true;     
     opts.inInputShareable=true;    
     opts.inTempStorage=new byte[16 * 1024]; 

Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h1) 
     , 65,65, true), 

Ngoài ra nhìn vào bên dưới liên kết để tăng bộ nhớ

http://developer.android.com/reference/android/R.styleable.html#AndroidManifestApplication_largeHeap

Detect application heap size in Android

EDIT 1

cố gắng sử dụng nostras image downloader, bạn có thể sử dụng nó để hiển thị hình ảnh trong bộ nhớ cục bộ. Và nó quản lý bộ nhớ rất tốt ...

https://github.com/nostra13/Android-Universal-Image-Loader

+0

tôi đã cập nhật câu hỏi, xin vui lòng có một relook – RDX

+0

tôi đã cố gắng này nhưng nó didnot làm việc hoặc – RDX

+0

Pls nhìn vào chỉnh sửa, tôi đề nghị bạn sử dụng thư viện nostras ' – Talha

25

Điều quan trọng cần lưu ý là sau mã có thể gây ra ngoại lệ:

Bitmap bitmap = Bitmap.createScaledBitmap(oldBitmap, newWidth, newHeight, true); 
oldBitmap.recycle(); 

đúng là:

Bitmap bitmap = Bitmap.createScaledBitmap(oldBitmap, newWidth, newHeight, true); 
if (oldBitmap!= bitmap){ 
    oldBitmap.recycle(); 
} 

vì tài liệu nói:

Nếu chiều rộng và chiều cao quy định là giống như chiều rộng hiện tại và chiều cao của btimap nguồn, bitmap nguồn được trả về và bây giờ là bitmap mới được tạo.

+0

Mã này vẫn có thể kích hoạt ngoại lệ nếu bitmap đã được tái chế vì bất kỳ lý do gì, bạn cần phải thêm nó vào kiểm tra: &&! OldBitmap.isRecycled() –

+0

Trong đó việc triển khai lớp bitmap là cần thiết? Bởi vì không phải trong 5.1.0_r1, vì phương pháp này tự kiểm tra: "if (! MRecycled && mFinalizer.mNativeBitmap! = 0)" http://grepcode.com/file/repository.grepcode.com/java/ext/com .google.android/android/5.1.0_r1/android/graphics/Bitmap.java # Bitmap.recycle% 28% 29 – Malachiasz