অ্যান্ড্রয়েড ২.২.৩ (এপিআই লেভেল ১০) এবং এর চেয়ে নীচের সংস্করণে, recycle()ব্যবহার সুপারিশ করা হয়। আপনি যদি আপনার অ্যাপে বড় আকারের বিটম্যাপ ডাটা প্রদর্শন করতে চান, আপনার OutOfMemoryError এরর এর মধ্যে রান করার সম্ভাবনা। recycle()মেথড একটি অ্যাপকে যত দ্রুত সম্ভব মেমরী পূনরুদ্ধার করতে দেয়।
সতর্কতা: আপনার উচিত recycle()ব্যবহার করা শুধূমাত্র তখন যখন আপনি নিশ্চিত হবেন যে বিটম্যাপ আর ব্যবহার হচ্ছে না। আপনি যদি recycle()কল করেন এবং পরবর্তীতে বিটম্যাপ ড্র করতে চেষ্টা করে, আপনি এরর পাবেন:
"Canvas: trying to use a recycled bitmap".
নিম্নোক্ত কোডের খন্ডচিত্রটি recycle()কলের একটি উদাহরণ দেয়। এটা একটি বিটম্যাপ বর্তমানে প্রদর্শিত হচ্ছে নাকি ক্যাশেতে আছে তা খুঁজে বের করতে রেফারেন্স কাউন্টিং(ভেরিয়েবল mDisplayRefCount এবং mCacheRefCount এর মধ্যে) ব্যবহার করে। কোড বিটম্যাপকে রিসাইকেল করে যখন এই অবস্থার সম্মূখিন হয়:
রেফারেন্স কাউন্ট mDisplayRefCount এবং mCacheRefCount উভয়ের জন্য ০ হয়
বিটম্যাপ null নয় এবং এটা এখনও রিসাইকেল হয় নাই
private int mCacheRefCount = 0; private int mDisplayRefCount = 0; ... // Notify the drawable that the displayed state has changed. // Keep a count to determine when the drawable is no longer displayed. public void setIsDisplayed(boolean isDisplayed) {
synchronized (this) {
if (isDisplayed) {
mDisplayRefCount++;
mHasBeenDisplayed = true;
} else {
mDisplayRefCount--;
}
}
// Check to see if recycle() can be called.
checkState();
}
// Notify the drawable that the cache state has changed. // Keep a count to determine when the drawable is no longer being cached. public void setIsCached(boolean isCached) {
synchronized (this) {
if (isCached) {
mCacheRefCount++;
} else {
mCacheRefCount--;
}
}
// Check to see if recycle() can be called.
checkState();
}
private synchronized void checkState() {
// If the drawable cache and display ref counts = 0, and this drawable
// has been displayed, then recycle.
if (mCacheRefCount <= 0 && mDisplayRefCount <= 0 && mHasBeenDisplayed
&& hasValidBitmap()) {
getBitmap().recycle();
}
}
private synchronized boolean hasValidBitmap() {
Bitmap bitmap = getBitmap();
return bitmap != null && !bitmap.isRecycled();
}