2011-08-31 35 views
30

Tôi đã tạo một GalleryView và ImageView hiển thị Hình ảnh lớn hơn khi một mục được nhấp vào trong thư viện. Tôi đã sử dụng mã dưới đây để thực hiện ImageAdapter:sử dụng phương thức recycle() trong TypedArray

public ImageAdapter(Context c) 
{ 
    context = c; 
    TypedArray a = obtainStyledAttributes(R.styleable.gallery1); 
    itemBackground = a.getResourceId(R.styleable.gallery1_android_galleryItemBackground, 0);  
    a.recycle();  
} 

Khi tôi xóa bảng sao kê a.recycle() không có sự thay đổi và các ứng dụng đang chạy bình thường như trước, nhưng ở khắp mọi nơi tôi đọc rằng nó là bắt buộc để tái chế các typedArray. Khi không có thay đổi về cách ứng dụng của tôi đang chạy, hãy sử dụng phương pháp recycle().

Bất kỳ ai cũng có thể giải thích chi tiết cho tôi. Cảm ơn bạn.

Trả lời

25

Điểm này tương tự như ý tưởng xóa con trỏ bằng ngôn ngữ C (nếu bạn quen thuộc với điều đó). Nó được sử dụng để làm cho dữ liệu liên kết với "a" đã sẵn sàng cho việc thu gom rác để bộ nhớ/dữ liệu không bị ràng buộc không hiệu quả với "a" khi nó không cần. Đọc thêm here. Điều quan trọng cần lưu ý rằng điều này không thực sự cần thiết trừ khi bạn đang thực sự tái sử dụng "a". GC sẽ tự động xóa dữ liệu này cho bạn nếu đối tượng không được sử dụng lại. Lý do tại sao một typedArray là khác nhau, tuy nhiên, là bởi vì một typedArray có dữ liệu nội bộ khác phải được trả về (được gọi là StyledAttributes) cho TypedArray để tái sử dụng sau này. Đọc về điều đó here.

+2

Lưu ý phụ: GC là viết tắt của "thu gom rác". – Vinay

+3

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

+0

@ 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

5

recycle() làm cho bộ nhớ được phân bổ được trả về hồ bơi sẵn có ngay lập tức và sẽ không ở lại cho đến khi thu gom rác. Phương pháp này cũng có sẵn cho Bitmap.

0

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.

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