Tôi khá mới phát triển Android và dường như tôi không thể hiểu ngoại lệ Java Out of Memory. Tôi biết điều đó có nghĩa là ứng dụng của tôi đã vượt qua ngân sách VM nhưng sau khi Googling điều này nhiều lần tôi vẫn không có vẻ nắm bắt khái niệm này. Tôi e rằng ứng dụng của tôi sử dụng quá nhiều bộ nhớ vì tôi có sáu bộ chọn nút trên mỗi màn hình với hai bitmap cho mỗi bộ chọn khoảng 20 kb mỗi bộ theo tab thuộc tính. Trên G2x gốc của tôi, tôi đã đặt ngân sách VM thành 12mb, khởi động lại điện thoại và chạy ứng dụng của mình mà không gặp bất kỳ vấn đề gì. Tôi unbinding drawables trên mỗi onDestroy() và gợi ý tại GC để chạy ở đây cũng có. Sau khi sử dụng ứng dụng một thời gian trong trình mô phỏng, tôi nhấp vào "Nguyên nhân GC" trên màn hình DDMS của tôi và kết quả là ID = 1, Kích thước Heap 6,33 MB, Phân bổ 2,895 MB, Miễn phí 3,28 MB,% Được sử dụng 47,20, # Đối tượng 52,623.Android Hiểu kích thước Heap
Đây là nơi tôi không hiểu điều gì đang xảy ra, trình giả lập của tôi được đặt thành 24MB VM. Số đó ở đâu? Vấn đề thực tế tôi gặp phải là nếu tôi thiết lập giả lập 16MB VM, ứng dụng của tôi gặp sự cố thứ hai với ngoại lệ Out of Memory. Làm thế nào đến nó không sụp đổ trên điện thoại của tôi với VM thiết lập đến 12 MB hoặc trên điện thoại HTC Magic cũ của tôi với 12 MB cổ phiếu VM? Các bạn có nghĩ ứng dụng của tôi đang chiếm quá nhiều bộ nhớ không? Tôi không biết liệu những số DDMS đó có tốt hay không. Cảm ơn vì đã dành thời gian cho tôi.
Đối với mã của tôi, tôi có mọi hình ảnh được chỉ định trong bố cục XML Tôi không thực hiện bất kỳ điều gì theo lập trình với chúng ngoại trừ việc thêm người nghe vào chúng. Tôi tìm thấy mã này ở đây và tôi đã thêm nó vào mọi hoạt động mà tôi có ...
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(findViewById(R.id.myRootLayout));
System.gc();
}
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
Nếu không, tất cả những gì tôi làm là thêm onClickListeners vào các nút có hình nền PNG. Tôi muốn tìm hiểu làm thế nào để chỉ định nền nút lập trình nhưng tôi cần phải có các chức năng chọn như trên tập trung, trên báo chí, không tập trung nhưng ép vv để làm cho nền nút thay đổi theo tương tác người dùng. Tôi đã xem xét các tài liệu về điều này nhưng nó có vẻ áp đảo, đó là lý do tại sao tôi figured tôi bắt đầu ở đây với những điều cơ bản của quản lý Heaps và làm việc theo cách của tôi lên để xác định selectors trong mã. Điều này có thể không có ý nghĩa nhưng có một số lượng "khỏe mạnh" phân bổ bộ nhớ mà một ứng dụng có thể phân bổ mà không nhận được gần với Out of Memory ngoại lệ? Ví dụ nếu một ứng dụng được phân bổ 6MB, nó sẽ ổn nhưng 8MB sẽ đẩy nó, có giới hạn như thế trong phân bổ bộ nhớ không? Cảm ơn Alex Lockwood lần nữa vì câu trả lời của bạn Tôi sẽ đọc và đọc lại nó cho đến khi công cụ này có ý nghĩa với tôi
+1, câu trả lời rất có nhiều thông tin! –
Cảm ơn bạn rất nhiều! Tôi đã học được rất nhiều từ đó. Tôi đang thêm một số thông tin vào cuối câu hỏi –
Nhận xét về độ phân giải lại "20 kb mỗi âm thanh đều ổn" - AFAIK, không quan trọng kích thước tệp * là gì (sẽ nhỏ hơn đối với hình ảnh nén tốt hơn), điều quan trọng là * DIMENSIONS * là gì; trong bộ nhớ, với màu sắc đầy đủ, sẽ lấy 4B mỗi pixel, phải không? Do đó, điều quan trọng là phải thay đổi kích thước hình ảnh khi bạn tải nó [android docs - Tải một phiên bản thu nhỏ xuống bộ nhớ], dựa trên kích thước thực tế cần thiết, cho thiết bị hiện tại. – ToolmakerSteve