8

Tôi đang làm việc để chuyển marshmallow android cho một số phần cứng. Vấn đề tôi đang phải đối mặt là, nếu tôi tạo một đối tượng UI thông qua xml, nó không bị GC quét. Ví dụ:Đối tượng giao diện người dùng được tạo thông qua XML không bị quét trong Android Marshmallow

Tôi đã tạo một ứng dụng để kiểm tra điều này. Ứng dụng này đang có 2 hoạt động. Mỗi hoạt động có một nút. Nếu tôi nhấn nút này, nó kết thúc hoạt động hiện tại và bắt đầu hoạt động khác.

Nếu tôi xác định nút trong bố cục xml và trong chế độ xem tập hợp hoạt động, nó sẽ tạo đối tượng của nút loại. Bây giờ tôi đang bật tắt các hoạt động này một lần nữa và một lần nữa để tạo ra nhiều đối tượng của nút, vì tôi không sử dụng bất kỳ LAUNCH_MODE (Cố ý).

Bây giờ cho phép nói 8 đối tượng của Nút đã được tạo. Tôi nhấn nút nhiều lần và trở về màn hình chính. Tôi đã bắt đầu GC từ Android Studio. Sau đó nếu tôi lấy Heap Dump, tôi vẫn tìm thấy 8 trường hợp Button nhưng "id của các đối tượng được thay đổi". Hơn nữa, tôi thấy rằng constructor của lớp Button không được gọi sau khi tôi bắt đầu GC.

Vì vậy, những người đã tạo các đối tượng này. Và nếu đây là những đối tượng tương tự, tại sao id đã được thay đổi.

Cùng một điều nếu tôi làm bằng cách tạo ra đối tượng Nút sử dụng lớp java Button,

như Nút b = Nút mới (Context c);

đối tượng đang được quét.

Vui lòng đặt một số ánh sáng nếu bạn hiểu sự cố.

BR, Rahul

+2

Bạn có thể chia sẻ [mcve] không? – antonio

Trả lời

0

Bạn chưa cung cấp bất kỳ ví dụ mã cho những gì bạn đang nói về. Tôi chỉ có thể đoán rằng bạn đang thực sự tạo ra những đối tượng nút như bạn đã đề cập,

Button b = new Button(this); 

Nếu bạn đang tham khảo một widget nút trong XML thì bạn không nên tạo ra bất kỳ đối tượng Button, bạn chỉ nên instantiating đối tượng.

Nút tạo trong XML

<Button 
    android:id="@+id/btn_action" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

nút Instantiating trong mã

Button btnAction = (Button) findViewById(R.id.btn_action); 

đối tượng Nút này không nên có nhiều tài liệu tham khảo id. Khi bạn chỉ định id cho tiện ích này trong XML, id tham chiếu sẽ được thêm ngay vào tệp R.java của bạn. Kiểm tra tệp R.java của bạn, bạn sẽ thấy một cái gì đó như

public static final int btn_action=0x7f0d033b; 

Đây là giá trị cuối cùng, nó không thể thay đổi. Vì vậy, mỗi khi bạn tham chiếu đối tượng, btnAction, bạn đang tham chiếu đến 0x7f0d033b. Phá hủy hoạt động của bạn sẽ phá hủy đối tượng này trừ khi bạn đang làm một cái gì đó kỳ lạ như tạo các đối tượng tĩnh.

Cũng lưu ý rằng không có gì đảm bảo rằng GC sẽ được gọi ngay lập tức sau khi Hoạt động bị hủy. Nó chủ yếu được gọi khi cần thiết. Nếu bạn muốn giúp "buộc" GC được gọi khi một Hoạt động bị hủy thì hãy dọn sạch trong onDestroy() của Hoạt động. Chúc mừng!

@Override 
protected void onDestroy() { 
    // invoke garbage collector 
    System.gc(); 
} 

Cũng cần lưu ý rằng việc gọi System.gc() không nhất thiết có nghĩa là Trình thu gom rác sẽ được gọi. Định nghĩa cho điều này là

Cho biết VM là thời điểm thích hợp để chạy thùng rác bộ thu. Lưu ý rằng đây chỉ là gợi ý. Không có đảm bảo rằng bộ thu gom rác sẽ thực sự được chạy.

+0

Thực ra tôi đang thử cả hai. Với: Nút b = Nút mới (điều này); Đối tượng của nút đang được quét khi tôi khởi tạo GC. Với: Cách XML Các đối tượng nút không bị quét khi tôi bắt đầu GC. Tôi hiểu GC không được bảo đảm, nhưng tôi đang bắt đầu từ màn hình android, điều này sẽ quét tất cả các đối tượng không tham chiếu. – Rahul

0

Không cần nút mới, nút đã được xác định trong tệp kê khai, chỉ cần sử dụng findViewById để tìm kiếm.

Các vấn đề liên quan