2013-07-16 11 views
6

Tôi đã cố gắng để nắm bắt xung quanh việc giải mã tập tin hình ảnh, nhưng nó không bắt được ngoại lệ bộ nhớ, và ứng dụng bị treo.Tôi có thể loại bỏ ngoại lệ bộ nhớ trong Android trong phân bổ Bitmap để giải mã một tệp hình ảnh không?

Tôi biết một số thủ thuật trong giải mã tệp hình ảnh, chẳng hạn như lấy mẫu con. Nhưng tôi cần phóng to hình ảnh để xem chi tiết, vì vậy tôi không thể áp dụng mẫu quá nhiều. Đối với một số thiết bị mới hơn, nó có thể cấp phát bộ nhớ lớn hơn để tránh ngoại lệ bộ nhớ.

Đối với một số thiết bị cũ hơn, không thể.

Nếu tôi có thể tùy chỉnh ứng dụng của mình cho các thiết bị khác nhau, điều đó thật tuyệt vời.

Vì vậy, tôi muốn: (1) Tôi hy vọng tôi có thể catech ra khỏi bộ nhớ ngoại lệ, vì vậy trong trường hợp tôi bắt nó, tôi có thể giảm kích thước hình ảnh. (2) Hoặc, tôi hy vọng tôi có thể nhận được kích thước bộ nhớ có sẵn để phân bổ.

Tôi tìm kiếm trực tuyến, không tìm thấy câu trả lời.

+0

Hãy nhớ rằng ngay cả khi bạn nắm bắt thành công OutOfMemoryException, bạn vẫn còn thiếu bộ nhớ và không đảm bảo rằng Hoạt động của bạn hoặc VM Dalvik sẽ không làm điều gì đó để đẩy bộ nhớ vượt quá giới hạn một lần nữa. ném từ văn học ở bất cứ đâu. Ngay cả khi nó có vẻ hoạt động trên các thiết bị bạn đã thử nghiệm, nó vẫn sẽ là một thực tế rất nguy hiểm. – Kai

+0

Đầu tiên, có thể bắt ngoại lệ OutOfMemroy, không gây ra sự cố ứng dụng, đó là những gì tôi mong muốn. Thứ hai, nếu tại một số thời điểm và đối với một số thiết bị, nó có thể phân bổ một lượng lớn kích thước bộ nhớ, tôi muốn cho người dùng có trải nghiệm sử dụng tốt hơn, phù thủy vẫn hữu ích; trong trường hợp bộ nhớ bị hạn chế, thì tôi sẽ để độ phân giải thấp hơn. Trong mọi trường hợp, cathing hoặc biết vấn đề bộ nhớ là hữu ích. – user1914692

Trả lời

5

Trước tiên, bạn có thể thấy trong theo dõi ngăn xếp nơi lỗi OutOfMemoryError bị ném. Nếu bạn không nắm bắt được nó, đó là một trong hai vì bạn đã bắt ngoại lệ thay vì Throwable, hoặc b) lỗi đã được ném ở một nơi khác hơn là nơi bạn có câu lệnh bắt. Với OutOfMemoryError bạn không thể đảm bảo nó sẽ được ném ở đâu. Thông thường nó là nơi bạn đang xử lý bitmap, nhưng nó có thể là một luồng khác xảy ra để cấp phát bộ nhớ cùng một lúc.

Lấy bộ nhớ có sẵn trên thiết bị là tầm thường: http://developer.android.com/reference/android/app/ActivityManager.html#getMemoryClass()

Đội Android có một tập lớn các bài báo trên bitmap và bộ nhớ nếu bạn không nhìn thấy họ được nêu ra: http://developer.android.com/training/displaying-bitmaps/index.html

Chúc may mắn!

+0

Cảm ơn bạn! Tôi bắt được Throwable. – user1914692

+1

làm thế nào bạn bắt Throwable –

+0

Tôi đoán ông đánh bắt nó giống như Ngoại lệ: thử { } catch (Throwable t) { t.printStackTrace(); } – tritop