tái chế về cơ bản có nghĩa là ... miễn phí/xóa tất cả dữ liệu được liên kết với tài nguyên tương ứng. Trong Android, chúng tôi có thể tìm thấy tái chế cho Bitmap và TypedArray.
Nếu bạn kiểm tra cả hai tệp nguồn thì bạn có thể tìm thấy biến boolean "mRecycled" là "false" (giá trị mặc định). Nó được gán cho "true" khi tái chế được gọi.
Vì vậy, bây giờ nếu bạn kiểm tra phương pháp đó (phương pháp tái chế trong cả hai lớp) thì bạn có thể quan sát thấy chúng đang xóa tất cả các giá trị.
Để tham khảo ở đây là các phương pháp.
Bitmap.java:
public void recycle() {
if (!mRecycled && mNativePtr != 0) {
if (nativeRecycle(mNativePtr)) {
// return value indicates whether native pixel object was actually recycled.
// false indicates that it is still in use at the native level and these
// objects should not be collected now. They will be collected later when the
// Bitmap itself is collected.
mBuffer = null;
mNinePatchChunk = null;
}
mRecycled = true;
}
}
TypedArray.java
public void recycle() {
if (mRecycled) {
throw new RuntimeException(toString() + " recycled twice!");
}
mRecycled = true;
// These may have been set by the client.
mXml = null;
mTheme = null;
mAssets = null;
mResources.mTypedArrayPool.release(this);
}
dòng này
mResources.mTypedArrayPool.release(this);
sẽ nhả typedArray từ SunchronisedPool có giá trị mặc định là 5. Vì vậy, bạn không nên sử dụng cùng typedArray một lần nữa vì nó bị xóa.
một khi "mRecycled" của TypedArray là đúng thì trong khi nhận được thuộc tính của nó, nó sẽ ném RuntimeException nói "Không thể thực hiện cuộc gọi đến một ví dụ tái chế!".
trường hợp hành vi simliar của Bitmap. Hy vọng điều đó sẽ hữu ích.
Lưu ý phụ: GC là viết tắt của "thu gom rác". – Vinay
Tôi không hiểu. Liên kết cuối cùng làm cho nó có vẻ như gọi recycle() cho phép một số mảng nội bộ được tái sử dụng. Điều này không có nghĩa là nó ngăn không cho mảng bị GC?Tại sao bạn nói rằng nó làm cho dữ liệu liên kết với "a" đã sẵn sàng cho GC? – gsingh2011
@ gsingh2011 nó cho phép nó được "tái sử dụng bởi người gọi sau". Phải thừa nhận rằng các từ ngữ tài liệu hơi khó xử, nhưng những gì họ nhận được là bộ nhớ kết hợp với 'TypedArray' có thể được sử dụng lại bởi người gọi sau (không phải là cá thể chính nó khi bạn hiểu nó trong giới hạn của chương trình). Đó là lý do tại sao tài liệu cũng nói "Sau khi gọi chức năng này, bạn không bao giờ phải chạm vào mảng đã nhập một lần nữa." – Vinay