2013-03-19 24 views
5

Trước tiên, tôi biết có rất nhiều bài viết liên quan, tôi đã đọc rất nhiều trong số họ, không ai trong số họ đã giúp và tôi ra khỏi ý tưởng :)lỗi OutOfMemory Android & LruCache

Vì vậy, tôi đang phát triển một ứng dụng android (sdk phiên bản 14+) sử dụng rất nhiều hình ảnh (cho các nút, biểu tượng, hiển thị rất nhiều hình ảnh và vv). Kích thước hình ảnh trung bình là 120kb + - 100kb

Tiêu đề cho biết tôi là lỗi gettin OutOfMemory. Lúc đầu, tôi đã thêm nguồn hình ảnh vào ImageViews bằng xml hoặc lập trình bằng setImageResource. Sớm ứng dụng bắt đầu sụp đổ do lỗi OutOfMemory. Vì vậy, tôi đã đọc (http://developer.android.com/reference/android/util/LruCache.html) hướng dẫn này và triển khai LruCache như nó nói. Tôi đã thêm bitmap vào lrucache và sau đó sử dụng phương thức get để đặt bitmap thành imageview.

Trong phương thức onDestroy của hoạt động, tôi gọi evictAll method trên lrucache và tôi đặt lrucache thành null. Vì vậy, tôi đoán, bộ nhớ được giải phóng sau đó.

Tuy nhiên sự cố vẫn tiếp diễn, khi tôi thực hiện một số hoạt động, ứng dụng gặp sự cố.

Giúp đánh giá cao :)

+0

Các bạn đã cố gắng sử dụng bộ nhớ cache đĩa? http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html – Neil

+0

Bạn có đang đặt tất cả hình ảnh ur trong thư mục có thể vẽ không? Nếu u r sau đó thử đặt chúng trong các thư mục drawable-? Dpi khác nhau theo mật độ của thiết bị ur ... –

Trả lời

3

Theo tài liệu vượt quá bộ nhớ VM tối đa có sẵn sẽ ném ngoại lệ OutOfMemory. Có vẻ như bộ nhớ đệm bitmap vượt quá bộ nhớ ảo có sẵn.

Tái chế các ảnh bitmap khi không sử dụng.

bitmap.recycle(); 

When should I recycle a bitmap using LRUCache?. Có một cái nhìn vào câu trả lời được chấp nhận bởi commonsware.

Tôi tin rằng khi LRUCache evicts một hình ảnh để nhường chỗ cho nhau, bộ nhớ không được trả tự do. (Khi được hỏi của thành viên trong liên kết ở trên)

Nó sẽ không thể được, cho đến khi Bitmap là tái chế hoặc thu gom rác thải (trả lời bằng commomsware).

http://www.youtube.com/watch?v=_CruQY55HOk. Nói về quản lý bộ nhớ, rò rỉ bộ nhớ và sử dụng MAT Analyzer.

+0

Tôi vẫn đang cố khắc phục sự cố. Tôi đang gọi phương thức tái chế trên bitmap trong phương thức entryRemoved của lớp lrucache nhưng nó không giải quyết được vấn đề. Tôi nghĩ rằng nó sẽ làm việc, bởi vì tôi thêm tất cả các hình ảnh cần thiết vào bộ đệm trong phương thức onCreate của hoạt động. Các hình ảnh sau đó được sử dụng thông qua tuổi thọ hoạt động. –

+0

sử dụng phân tích mat để tìm và khắc phục sự cố – Raghunandan

+0

ứng dụng của tôi đang sử dụng nhiều bộ nhớ hơn và heap cứ tăng ... và cho OOM.?solution – GvSharma

1

Bạn có lưu trữ tất cả hình ảnh trong heap không? Nếu vậy, bạn nên lưu trữ chúng trong thẻ sd hoặc bộ nhớ trong và giữ chỉ một nhóm trong heap (cách tiếp cận tốt là sử dụng bộ nhớ cache LRU).

Nếu bạn đã thực hiện việc này ... bạn có thể tải xuống công cụ phân tích bộ nhớ và gỡ lỗi việc sử dụng bộ nhớ của ứng dụng.

http://www.eclipse.org/mat/

Đối phó với OutOfMemoryError có thể được thực sự đau đớn.

Chúc may mắn!

+0

cảm ơn bạn đã trả lời, nhưng vấn đề là tôi cần tất cả các hình ảnh trong suốt thời gian hoạt động. Tôi tin rằng một số hình ảnh tồn tại trong bộ nhớ ngay cả khi hoạt động bị phá hủy, bởi vì lỗi xảy ra chỉ khi tôi "đạp xe" qua vài hoạt động (đôi khi lỗi xảy ra tương đối sớm, đôi khi không). –

4

Xin cảm ơn các bạn đã giúp tôi rất nhiều!

Vì vậy, nếu có ai lướt sóng cho câu hỏi này với cùng một vấn đề, sau đây là một số hướng dẫn:

  • gọi .recycle() trên bitmap khi bạn không cần chúng nữa.
  • sử dụng Eclipse Memory Analyzer để tìm các vấn đề của bạn
  • (phải) thấy this Video
  • here's cách xem bitmap từ file .hprof bạn