على سبيل المثال ، صور تحميل شبكة ذاكرة التخزين المؤقت:
// احصل على الحد الأقصى للذاكرة المخصصة بواسطة التطبيق int maxmemory = (int) وقت التشغيل. getRuntime (). maxmemory () ؛ // احصل على 1/5 من الذاكرة لاستخدامها عندما يكون حجم ذاكرة التخزين المؤقت ذاكرة تخزين مؤقت = maxmemory/5 ؛ // الفوري lrucache lroucache = new lrucache <string ، bitmap> (cachsize) {// method method sizeof يحدد حجم ذاكرة التخزين المؤقت لكل صورة محمية بحجم int (مفتاح السلسلة ، قيمة صورة نقطية) value.getByTeCount () ؛ }} ؛ عادة ما يتم وضع الرمز أعلاه في طريقة التهيئة
في الواقع ، يمكن فهم فئة Lurcache كخريطة فئة الخريطة. هناك طرق والحصول على الأساليب
بعد ذلك ، وضع الاتصال واحصل على أساليب للوصول إلى الموارد المخزنة مؤقتًا
إضافة Lurcache:
public putbitmaptocache (url url string ، bitmap bitmap) {if (getBitMapFromCache (url) == null) {// just ما إذا كانت ذاكرة التخزين المؤقت الحالية موجودة lrucache.put (url ، bitmap) ؛ }} lurcache get: public bitmap getBitMap fromCache (url string) {return lrucache.get (url) ؛ // lrucache يمكن اعتبارها خريطة} يمكن استدعاء ما سبق إضافة والحصول على أساليب تخزين موارد ، وهو أمر بسيط للغاية.
ولكن كن حذرًا من أن LruCache lruCache=new LruCache<String, Bitmap>(cachSize) يمكن أن يكون جديدًا مرة واحدة فقط ، وإلا سيتم تخزين الكائنات المختلفة بشكل مختلف.
متصل بفئة lroucache من Android
حزمة Android.Util ؛ استيراد java.util.linkedhashmap ؛ استيراد java.util.map ؛ /*** ذاكرة التخزين المؤقت التي تحمل إشارات قوية إلى عدد محدود من القيم. في كل مرة * يتم الوصول إلى قيمة ، يتم نقلها إلى رأس قائمة انتظار. عندما تتم إضافة قيمة * إلى ذاكرة التخزين المؤقت الكاملة ، يتم إخلاء القيمة في نهاية قائمة الانتظار وقد تصبح مؤهلة لجمع القمامة. * ذاكرة التخزين المؤقت يحفظ إشارة قوية للحد من عدد المحتويات. كلما تم الوصول إلى العنصر ، سينتقل العنصر إلى رأس قائمة الانتظار. * عند إضافة عنصر جديد عند امتلاء ذاكرة التخزين المؤقت ، سيتم إعادة تدوير العنصر في نهاية قائمة الانتظار. * <p> إذا كانت القيم المخبأة الخاصة بك تحمل موارد تحتاج إلى إصدارها بشكل صريح ، * تجاوز {link #EntryRemoved}. * إذا كان ينبغي حساب تفويت ذاكرة التخزين المؤقت عند الطلب على المفاتيح المقابلة ، * تجاوز {link #create}. هذا يبسط رمز الاتصال ، مما يتيح له * افتراض أن القيمة سيتم إرجاعها دائمًا ، حتى عندما تكون هناك تفويت ذاكرة التخزين المؤقت. * إذا فقد العنصر المقابل للمفتاح ، فأعد كتابة CREATE (). هذا يبسط رمز الاتصال وسيعود دائمًا حتى لو فقد. * <p> افتراضيًا ، يتم قياس حجم ذاكرة التخزين المؤقت في عدد الإدخالات. تجاوز * {link #sizeof} لحجم ذاكرة التخزين المؤقت في وحدات مختلفة. على سبيل المثال ، يقتصر هذا ذاكرة التخزين المؤقت * على 4Mib من Bitmaps: حجم ذاكرة التخزين المؤقت الافتراضية هو عدد العناصر المقاسة ، ويتم تجاوز حجم ذاكرة التخزين المؤقت لحساب حجم العناصر المختلفة *. * <pre> {code * int cachesize = 4 * 1024 * 1024 ؛ // 4mib * lrucache <string ، bitmap> bitmapcache = new lrucache <string ، bitmap> (cachesize) { * protected int sizeof (مفتاح السلسلة ، قيمة bitmap) { * return value.getbytecount () ؛ *} *}} </pre> * * <p> هذه الفئة آمنة مؤشر الترابط. قم بإجراء عمليات ذاكرة التخزين المؤقت المتعددة بشكل ذري عن طريق * المزامنة على ذاكرة التخزين المؤقت: <pre> {code * Synchronized (cache) { * if (cache.get (key) == null) { * cache.put (المفتاح ، القيمة) ؛ *} *}} </pre> * * <p> لا تسمح هذه الفئة باستخدام NULL كمفتاح أو قيمة. قيمة * return * null من {link #get} ، {link #put} أو {link #remove} غير مضمون: لم يكن المفتاح في ذاكرة التخزين المؤقت. * المفتاح أو القيمة هو NULL * عند GET () ، PUT () ، إزالة () قيمة الإرجاع فارغة ، العنصر المقابل للمفتاح ليس في ذاكرة التخزين المؤقت */ الفئة العامة LRUCACHE <K ، V> {Private Final LinkedHashMap <K ، V> MAP ؛ /** حجم هذه ذاكرة التخزين المؤقت في الوحدات. ليس بالضرورة عدد العناصر. */ حجم الباحث الخاص ؛ // الحجم الذي تم تخزينه الخاص int maxSize ؛ // الحد الأقصى للمساحة التخزين المحددة putcount int ؛ // عدد PUT PRIGY int createCount ؛ // عدد أوقات إنشاء int intictioncount الخاصة ؛ // عدد أوقات المعاد تدويرها int int int itcount ؛ // عدد الزيارات الخاصة بـ int misscount ؛ // عدد المفقود/** * param maxSize للاختداءات التي لا تتجاوز {link #sizeof} ، وهذا هو * الحد الأقصى لعدد الإدخالات في ذاكرة التخزين المؤقت. بالنسبة لجميع ذاكرة التخزين المؤقت الأخرى ، * هذا هو الحد الأقصى لمجموع أحجام الإدخالات في هذه ذاكرة التخزين المؤقت. */ public lrucache (int maxSize) {if (maxSize <= 0) {رمي new alfictalargumentException ("maxSize <= 0") ؛ } this.maxSize = maxSize ؛ this.map = new LinkedHashMap <k ، v> (0 ، 0.75f ، true) ؛ } /** * إرجاع القيمة لـ {Code Key} إذا كانت موجودة في ذاكرة التخزين المؤقت أو يمكن إنشاؤها بواسطة {Code #Create}. إذا تم إرجاع قيمة ، يتم نقلها إلى رأس قائمة الانتظار *. هذا يعود فارغة إذا لم يتم تخزين القيمة مؤقتًا ولا يمكن إنشاء *. إرجاع العنصر المقابل عن طريق المفتاح ، أو قم بإنشاء العنصر المقابل. سينتقل العنصر المقابل إلى رأس قائمة الانتظار ، * إذا لم يتم تخزين قيمة العنصر أو لا يمكن إنشاؤها ، فالارتداد فارغًا. */ public final v get (k key) {if (key == null) {رمي جديد nullpointerxception ("key == null") ؛ } v mapValue ؛ Synchronized (هذا) {mapValue = map.get (مفتاح) ؛ if (mapValue! = null) {hitCount ++ ؛ // ضرب العودة mapvalue ؛ } misscount ++ ؛ // فقد} / * * محاولة إنشاء قيمة. قد يستغرق هذا وقتًا طويلاً ، وقد تكون الخريطة * مختلفة عند إرجاع Create (). إذا تمت إضافة قيمة متضاربة إلى الخريطة أثناء وجود Create () ، فإننا نترك هذه القيمة في * الخريطة ونطلق القيمة التي تم إنشاؤها. * إذا كان مفقودًا ، فحاول إنشاء عنصر */ v createvalue = إنشاء (مفتاح) ؛ if (createvalue == null) {return null ؛ } Synchronized (this) {createCount ++ ؛ // Create ++ MapValue = map.put (مفتاح ، createvalue) ؛ if (mapValue! = null) {// كان هناك تعارض حتى تراجع عن وضع آخر // إذا كان هناك oldvalue قبل ذلك ، التراجع عن () map.put (المفتاح ، mapvalue) ؛ } آخر {size += safeSizeOf (المفتاح ، createvalue) ؛ }} if (mapValue! = null) {entryRemoved (false ، key ، createdValue ، mapValue) ؛ إرجاع mapvalue ؛ } آخر {trimtosize (maxSize) ؛ Return CreatedValue ؛ }} /*** caches {code value} لـ {code key}. يتم نقل القيمة إلى رأس * قائمة الانتظار. * * regurn القيمة السابقة التي تم تعيينها بواسطة {Code Key}. */ public final v put (k key ، v value) {if (key == null || value == null) {throw nullpointerxception ("key == null || value == null") ؛ } v السابق ؛ Synchronized (هذا) {putCount ++ ؛ size += safesizeof (المفتاح ، القيمة) ؛ السابق = map.put (المفتاح ، القيمة) ؛ إذا (سابق! = null) {// القيمة السابقة التي تم إرجاعها هي الحجم -= safeSizeOf (المفتاح ، السابق) ؛ }} if (سابق! = null) {intplyReMoved (خطأ ، مفتاح ، سابق ، قيمة) ؛ } trimtosize (maxSize) ؛ العودة السابقة ؛ } /*** param maxsize الحد الأقصى لحجم ذاكرة التخزين المؤقت قبل العودة. قد يكون -1 * لطرد حتى العناصر 0 الحجم. * مسح مساحة ذاكرة التخزين المؤقت*/ private void trimtosize (int maxSize) {بينما (true) {k key ؛ V قيمة ؛ Synchronized (this) {if (size <0 || (map.isempty () && size! = 0)) {رمي new alficalstateException (getClass (). getName () + ".sizeof () هو الإبلاغ عن نتائج غير متسقة!") ؛ } if (size <= maxSize) {break ؛ } map.entry <k ، v> toEvict = map.eldest () ؛ if (toEvict == null) {break ؛ } key = toEvict.getKey () ؛ القيمة = toevict.getValue () ؛ map.remove (مفتاح) ؛ الحجم -= safesizeof (المفتاح ، القيمة) ؛ EnsctionCount ++ ؛ } entryRemoved (true ، key ، value ، null) ؛ }} /*** يزيل الإدخال لـ {Code Key} إذا كان موجودًا. * احذف عنصر ذاكرة التخزين المؤقت المقابل للمفتاح وأرجع القيمة المقابلة * @Return القيمة السابقة المعينة بواسطة {Code Key}. */ public final v remove (k key) {if (key == null) {رمي nullpointerxception جديد ("key == null") ؛ } v السابق ؛ Synchronized (هذا) {previour = map.remove (مفتاح) ؛ إذا (سابق! = null) {size -= safeSizeOf (مفتاح ، سابق) ؛ }} if (سابق! = null) {intplyRemoved (false ، key ، prevent ، null) ؛ } العودة السابقة ؛ } /*** دعا إلى الإدخالات التي تم طردها أو إزالتها. يتم استدعاء هذه الطريقة * عندما يتم إلغاء القيمة لإيجاد مساحة ، أو إزالتها عن طريق مكالمة إلى * {link #remove} ، أو استبدالها بمكالمة إلى {link #put}. التنفيذ الافتراضي * لا يفعل شيئًا. * يسمى عندما يتم إعادة تدوير العنصر أو حذفه. قم بتغيير الطريقة عند إعادة تدوير القيمة وتحرر مساحة التخزين ، أو يطلق عليها إزالة ، أو عند استبدال قيمة العنصر ، فإن التنفيذ الافتراضي لا يفعل شيئًا. * <p> يتم استدعاء الطريقة بدون المزامنة: قد تصل مؤشرات الترابط الأخرى إلى ذاكرة التخزين المؤقت أثناء تنفيذ هذه الطريقة. * *@param تم إخلاء صحيح إذا تمت إزالة الإدخال لتوفير مساحة ، خطأ * إذا كان الإزالة ناتجة عن {link #put} أو {link #remove}. * صواب --- ضع أو إزالة الأسباب * param newValue القيمة الجديدة لـ {Code Key} ، إذا كانت موجودة. إذا لم يكن النفق ، * كان هذا الإزالة ناتجًا عن {link #put}. وإلا كان سببها * إخلاء أو {link #remove}. * / إدخال void المحمي (المنطقي المُطرّد ، مفتاح k ، v oldvalue ، v newValue) {} / *** يسمى بعد تفويت ذاكرة التخزين المؤقت لحساب قيمة للمفتاح المقابل. * إرجاع القيمة المحسوبة أو الفارغ إذا لم يكن من الممكن حساب قيمة. يعود التطبيق الافتراضي * الفارغ. * عند فقدان عنصر ما ، سيتم استدعاؤه ، وإرجاع القيمة المقابلة المحسوبة أو NULL * <P> يتم استدعاء الطريقة دون المزامنة: قد تصل مؤشرات الترابط الأخرى إلى ذاكرة التخزين المؤقت أثناء تنفيذ هذه الطريقة. * * <p> إذا كانت قيمة {code key} موجودة في ذاكرة التخزين المؤقت عند إرجاع هذه الطريقة * ، فسيتم إصدار القيمة التي تم إنشاؤها باستخدام {link #entryremoved} * والكشف عنها. يمكن أن يحدث هذا عندما تطلب مؤشرات ترابط متعددة نفس المفتاح * في نفس الوقت (مما يتسبب في إنشاء قيم متعددة) ، أو عند استدعاء مؤشر ترابط واحد {link #put} بينما يقوم الآخر بإنشاء قيمة لنفس المفتاح *. */ محمية v create (k key) {return null ؛ } private int safeSizeOf (k key ، v value) {int result = sizeof (key ، value) ؛ if (النتيجة <0) {رمي جديد alficalstateException ("الحجم السلبي:" + KEY + "=" + value) ؛ } نتيجة الإرجاع ؛ } /** * إرجاع حجم الإدخال لـ {Code Key} و {code value} في وحدات * المعرفة من قبل المستخدم. يتم إرجاع التطبيق الافتراضي 1 بحيث يكون الحجم * هو عدد الإدخالات وحجم أقصى هو الحد الأقصى لعدد الإدخالات. * إرجاع حجم العنصر المعرفة من قبل المستخدم ، يمثل العائد الافتراضي 1 عدد العناصر ، والحد الأقصى هو الحد الأقصى لقيمة العنصر* <p> يجب ألا يتغير حجم الإدخال أثناء وجوده في ذاكرة التخزين المؤقت. */ محمية int sizeof (k key ، v value) {return 1 ؛ } /*** قم بمسح ذاكرة التخزين المؤقت ، استدعاء {link #EntryRemoved} على كل إدخال تم إزالته. * clear cache */ public final void evictall () {trimtosize (-1) ؛ // -1 سوف يطرد العناصر ذات الحجم 0} /** * للذاكرة التخزين المؤقت التي لا تتجاوز {link #sizeof} ، وهذا يعيد رقم * من الإدخالات في ذاكرة التخزين المؤقت. بالنسبة لجميع ذاكرة التخزين المؤقت الأخرى ، فإن هذا يعيد مجموع * أحجام الإدخالات في هذه ذاكرة التخزين المؤقت. */ size final int final size () {حجم الإرجاع ؛ } /** * بالنسبة لخزائن التخزين المؤقت التي لا تتجاوز {link #sizeof} ، فإن هذا يعيد الحد الأقصى * لعدد الإدخالات في ذاكرة التخزين المؤقت. بالنسبة لجميع ذاكرة التخزين المؤقت الأخرى ، فإن هذا يعيد المبلغ الأقصى * لأحجام الإدخالات في هذه ذاكرة التخزين المؤقت. */ المزامنة العامة المتزامنة int maxSize () {return maxSize ؛ } /** * إرجاع عدد المرات {link #get} بإرجاع قيمة كانت موجودة بالفعل في ذاكرة التخزين المؤقت. */ المزامنة العامة المتزامنة int HitCount () {return HitCount ؛ } /** * إرجاع عدد المرات {link #get} التي تم إرجاعها أو تتطلب قيمة * جديدة لإنشاء. */ synchronized final int misscount () {return misscount ؛ } /*** إرجاع عدد المرات {link #create (object)} بإرجاع قيمة. */ synchronized final int createCount () {return createCount ؛ } /*** إرجاع عدد المرات {link #put} تم استدعاؤها. */ publicinized int putCount () {return putCount ؛ } /*** إرجاع عدد القيم التي تم طردها. */ المزامنة العامة المزامنة int infictionCount () {return efictionCount ؛ } /** * إرجاع نسخة من المحتويات الحالية من ذاكرة التخزين المؤقت ، التي تم طلبها من الأقل * تم الوصول إليها مؤخرًا إلى مؤخرًا. إرجاع نسخة من ذاكرة التخزين المؤقت الحالية ، من الأقل تم الوصول إليها مؤخرًا إلى مؤخرًا. الخريطة النهائية المتزامنة العامة <K ، V> Snapshot () {return New LinkedHashMap <K ، V> (MAP) ؛ } Override Public Synchronized Final Final ToString () {int accesses = hitCount + missCount ؛ int hitpercent = accesses! = 0؟ (100 * HitCount / Accesses): 0 ؛ return string.format ("lrucache [maxSize = ٪ d ، its = ٪ d ، misses = ٪ d ، hitRate = ٪ d ٪٪]" ، maxsize ، hitcount ، misscount ، hitpercent) ؛ }}