এটি 2018 এর শেষ তাই বিষয়গুলি পরিবর্তিত হয়েছে।
প্রথমত: আপনার অ্যাপ্লিকেশনটি চালান এবং অ্যান্ড্রয়েড স্টুডিওতে অ্যান্ড্রয়েড প্রোফাইলার ট্যাবটি খুলুন। আপনি দেখতে পাবেন যে এটি কতটা স্মৃতি গ্রহণ করে, আপনি অবাক হয়ে যাবেন তবে এটি প্রচুর র্যাম বরাদ্দ করতে পারে।
এছাড়াও মেমোরি প্রোফাইলার কীভাবে ব্যবহার করতে হয় সে সম্পর্কে বিস্তারিত নির্দেশাবলীর সাথে অফিসিয়াল ডক্সে একটি দুর্দান্ত নিবন্ধ রয়েছে যা আপনাকে আপনার মেমরি পরিচালনার গভীরতর চেহারা দিতে পারে।
তবে বেশিরভাগ ক্ষেত্রেই আপনার নিয়মিত অ্যান্ড্রয়েড প্রোফাইলার আপনার জন্য যথেষ্ট।
সাধারণত, কোনও অ্যাপ্লিকেশন 50 এমবি র্যাম বরাদ্দ দিয়ে শুরু হয় তবে আপনি যখন মেমরিতে কিছু ফটো লোড করতে শুরু করেন তখন তাত্ক্ষণিকভাবে 90Mb পর্যন্ত ঝাঁপিয়ে পড়ে। আপনি যখন প্রিলোড লোড ফটো (ভিউপিগার) এর সাথে প্রতিটি ভিউপ্যাজারের সাথে ক্রিয়াকলাপটি খুলেন (প্রতিটি প্রতি 3,5 এমবি) আপনি সেকেন্ডে 190Mb সহজেই পেতে পারেন।
তবে এর অর্থ এই নয় যে আপনার মেমরি পরিচালনায় সমস্যা রয়েছে।
আমি যে সর্বোত্তম পরামর্শ দিতে পারি তা হ'ল গাইডলাইন এবং সেরা অনুশীলনগুলি অনুসরণ করা, চিত্র লোডিংয়ের জন্য শীর্ষ গ্রন্থাগারগুলি ব্যবহার করুন (গ্লাইড, পিকাসো) এবং আপনি ঠিক থাকবেন।
তবে আপনাকে যদি কিছু উপস্থাপনের প্রয়োজন হয় এবং আপনার সত্যিকারের জানা দরকার যে আপনি ম্যানুয়ালি কতটা মেমরি বরাদ্দ করতে পারেন আপনি সম্পূর্ণ নিখরচায় স্মৃতি পেতে পারেন এবং এ থেকে একটি প্রাক-নির্ধারিত অংশ (% তে) গণনা করতে পারেন। আমার ক্ষেত্রে, ডিক্রিপ্ট করা ফটোগুলিকে মেমরির মধ্যে ক্যাশে করা দরকার ছিল তাই তালিকার মাধ্যমে প্রতিটি ব্যবহারকারী স্লাইডগুলি ডিক্রিপ্ট করার দরকার নেই don't
এই উদ্দেশ্যে আপনি LruCache ক্লাস ব্যবহারের জন্য প্রস্তুত ব্যবহার করতে পারেন । এটি একটি ক্যাশে শ্রেণি যা স্বয়ংক্রিয়ভাবে আপনার বস্তুগুলি কত মেমরি বরাদ্দ করে তা ট্র্যাক করে (বা উদাহরণগুলির সংখ্যা) এবং তাদের ব্যবহারের ইতিহাসের দ্বারা সাম্প্রতিকতম রাখার জন্য প্রাচীনতমটিকে সরিয়ে দেয়।
এটি কীভাবে ব্যবহার করবেন সে সম্পর্কে একটি দুর্দান্ত টিউটোরিয়াল এখানে ।
আমার ক্ষেত্রে, আমি ক্যাশেগুলির 2 টি উদাহরণ তৈরি করেছি: থাম্ব এবং সংযুক্তির জন্য। তাদের সিঙ্গেলটন অ্যাক্সেসের সাথে স্থিতিশীল করে তোলে যাতে তারা অ্যাপ্লিকেশন জুড়ে বিশ্বব্যাপী উপলব্ধ।
ক্যাশে ক্লাস:
public class BitmapLruCache extends LruCache<Uri, byte[]> {
private static final float CACHE_PART_FOR_THUMBS_PRC = 0.01f; // 1% (Nexus 5X - 5Mb)
private static final float CACHE_PART_FOR_ATTACHMENTS_PRC = 0.03f;// 3% (Nexus 5X - 16Mb)
private static BitmapLruCache thumbCacheInstance;
private static BitmapLruCache attachmentCacheInstance;
public static synchronized BitmapLruCache getDecryptedThumbCacheInstance() {
if (thumbCacheInstance == null) {
int cacheSize = getCacheSize(CACHE_PART_FOR_THUMBS_PRC);
//L.log("creating BitmapLruCache for Thumb with size: " + cacheSize + " bytes");
thumbCacheInstance = new BitmapLruCache(cacheSize);
return thumbCacheInstance;
} else {
return thumbCacheInstance;
}
}
public static synchronized BitmapLruCache getDecryptedAttachmentCacheInstance() {
if (attachmentCacheInstance == null) {
int cacheSize = getCacheSize(CACHE_PART_FOR_ATTACHMENTS_PRC);
// L.log("creating BitmapLruCache for Attachment with size: " + cacheSize + " bytes");
attachmentCacheInstance = new BitmapLruCache(cacheSize);
return attachmentCacheInstance;
} else {
return attachmentCacheInstance;
}
}
private BitmapLruCache(int maxSize) {
super(maxSize);
}
public void addBitmap(Uri uri, byte[] bitmapBytes) {
if (get(uri) == null && bitmapBytes != null)
put(uri, bitmapBytes);
}
public byte[] getBitmap(Uri uri) {
return get(uri);
}
@Override
protected int sizeOf(Uri uri, byte[] bitmapBytes) {
// The cache size will be measured in bytes rather than number of items.
return bitmapBytes.length;
}
}
এইভাবে আমি উপলব্ধ নিখরচায় র্যাম গণনা করি এবং এর থেকে আমি কতটা কামড় দিতে পারি:
private static int getCacheSize(float partOfTotalFreeMemoryToUseAsCache){
final long maxMemory = Runtime.getRuntime().maxMemory();
//Use ... of available memory for List Notes thumb cache
return (int) (maxMemory * partOfTotalFreeMemoryToUseAsCache);
}
ক্যাশেড চিত্র পেতে আমি এটি অ্যাডাপ্টারে এইভাবে ব্যবহার করি:
byte[] decryptedThumbnail = BitmapLruCache.getDecryptedThumbCacheInstance().getBitmap(thumbUri);
এবং আমি কীভাবে এটি ব্যাকগ্রাউন্ড থ্রেডে ক্যাশে সেট করব (নিয়মিত AsyncTask):
BitmapLruCache.getDecryptedThumbCacheInstance().addBitmap(thumbUri, thumbBytes);
আমার অ্যাপ্লিকেশন টিআইপি 19+ টার্গেট করে যাতে ডিভাইসগুলি পুরানো হয় না এবং উপলব্ধ র্যামের এই অংশগুলি আমার ক্ষেত্রে ক্যাশের জন্য যথেষ্ট (1% এবং 3%)।
মজাদার ঘটনা: আপনার অ্যাপ্লিকেশনটিতে বরাদ্দকৃত মেমরির পরিমাণ পাওয়ার জন্য অ্যান্ড্রয়েডের কোনও এপিআই বা অন্যান্য হ্যাক নেই, এটি বিভিন্ন কারণের ভিত্তিতে ফ্লাইতে গণনা করা হয়।
পিএস আমি একটি ক্যাশে ধরে রাখতে একটি স্ট্যাটিক শ্রেণীর ক্ষেত্র ব্যবহার করছি তবে সর্বশেষতম অ্যান্ড্রয়েড নির্দেশিকা অনুসারে এর জন্য ভিউমোডেল আর্কিটেকচার উপাদানটি ব্যবহার করার পরামর্শ দেওয়া হয়েছে ।