Например, кеш -сеть загружает изображения:
// Получить максимальную память, выделенную приложением int maxmemory = (int) runtime.getRuntime (). MaxMemory (); // Получить 1/5 памяти для использования, когда размер кэша имеет int cachesize = maxmemory/5; // instant lrucache lrucache = new lrucache <string, bitmap> (cachsize) {// size size method of size of Устанавливает размер кэша каждого изображения, защищенного int sizeof (String Key, значение растрового значения) {// называется каждый раз, когда кеш сохраняется, чтобы сообщить системе, насколько большим изображение кэша // Оправаемое для всех ресурсов для повторного размера для всех ресурсов для повторного размера для всех ресурсов для повторного момента для всех ресурсов для повторного времени для всех. value.getByteCount (); }}; Приведенный выше код обычно помещается в метод инициализации
На самом деле, класс Lurcache можно понимать как карту класса карты. Есть методы полока и получения
Далее, позвоните поставить и получить методы для доступа к кэшированным ресурсам
Lurcache's Add:
public void putbitmaptocache (string url, растровый растровый карта) {if (getbitmapfromcache (url) == null) {// Судья, существует ли текущий кэш lrucache.put (url, растровый карт); / Вызов вышеупомянутый добавление и получение методов может кэшировать ресурсы, что довольно просто.
Но будьте осторожны с тем, что LruCache lruCache=new LruCache<String, Bitmap>(cachSize) может быть новым только один раз, иначе разные объекты будут кэшированы по -разному.
Прикреплено с классом Android Lrucache
Пакет Android.util; импортировать java.util.linkedhashmap; импортировать java.util.map; /*** Кэш, который содержит прочные ссылки на ограниченное количество значений. Каждый раз * доступ к значению, оно перемещается в голову очереди. Когда значение * добавляется в полный кэш, значение в конце этой очереди выселяется и может * стать подходящим для сбора мусора. * Кэш сохраняет сильную ссылку, чтобы ограничить количество содержимого. Всякий раз, когда к элементу доступ к элементу, элемент будет перемещаться к головке очереди. * Когда новый элемент добавляется, когда кеш заполнен, элемент в конце очереди будет переработан. * <p> Если ваши кэшированные значения содержат ресурсы, которые необходимо явно выпущены, * переопределить {@link #EntryRemoved}. * Если кэш -пропуск должен быть рассчитан по требованию соответствующих клавиш, * переопределить {@link #create}. Это упрощает вызывающий код, позволяя ему * предположить, что значение всегда будет возвращено значение, даже когда пропускается кеш. * Если элемент, соответствующий ключу, потерян, перепишите Create (). Это упрощает вызывающий код и всегда будет возвращаться, даже если он потерян. * <p> По умолчанию размер кэша измеряется по количеству записей. Переопределить * {@link #Sizeof}, чтобы размер кэша в разных единицах. Например, этот кэш * ограничен 4 мин растровых карт: размер кэша по умолчанию - это количество измеренных элементов, а размер кэша переопределяется для расчета * размера разных элементов. * <pre> {@code * int cachesize = 4 * 1024 * 1024; // 4mib * lrucache <string, bitmap> bitmapcache = new lrucache <string, bitmap> (cachesize) { * protected int sizeof (string key, value bitmap) { * return value.getbytecount (); *} *}} </pre> * * <p> Этот класс безопасен для потока. Выполнить несколько операций кэша атомно атома с помощью * синхронизации на кэше: <pre> {@code * synchronized (cache) { * if (cache.get (key) == null) { * cache.put (key, value); *} *}} </pre> * * <p> Этот класс не позволяет использовать NULL в качестве ключа или значения. Return * значение null из {@link #get}, {@link #put} или {@link #Remove} - * однозначно: ключ не был в кэше. * ключ или значение null * Когда get (), put (), rement () возвращаемое значение является нулевым, соответствующий элемент ключа не находится в кэше */ public class lrucache <K, v> {private final LinkedHashmap <K, v> map; /** Размер этого кеша в единицах. Не обязательно количество элементов. */ private int size; // размер, который был сохранен в частном порядке; // указанное максимальное пространство для хранения частного int putcount; // количество Put Private Int CreateCount; // количество раз создавать частный int evictionCount; // количество раз переработанного частного хит -такого; // количество хитов частного int misscount; // количество потерянных/** * @param maxsize Для кэшей, которые не переопределяют {@link #sizeof}, это * максимальное количество записей в кэше. Для всех других кешей * это максимальная сумма размеров записей в этом кэше. */ public lrucache (int maxSize) {if (maxSize <= 0) {бросить новый allosalargumentException ("maxsize <= 0"); } this.maxsize = maxSize; this.map = new LinkedHashmap <K, V> (0, 0,75F, true); } /** * Возвращает значение для {@Code Key}, если оно существует в кэше или может быть * создано {@Code #Create}. Если значение было возвращено, оно перемещается к * головке очереди. Это возвращает NULL, если значение не кэшируется и не может быть создано. Верните соответствующий элемент по ключу или создайте возврат соответствующий элемент. Соответствующий элемент будет перемещаться к головке очереди, * Если значение элемента не кэшируется или не может быть создано, верните NULL. */ public final v get (k key) {if (key == null) {бросить новое nullpointerexception ("key == null"); } V MapValue; синхронизированный (this) {mapValue = map.get (key); if (mapValue! = null) {hitCount ++; // Хит return mapValue; } misscount ++; // потерянный} / * * Попытка создать значение. Это может занять много времени, и карта * может отличаться при возвращении Create (). Если конфликтное значение было * добавлено на карту во время работы (), мы оставляем это значение в * карте и отпускаем созданное значение. * Если он отсутствует, попробуйте создать элемент */ v createvalue = create (key); if (createdValue == null) {return null; } synchronized (this) {createCount ++; // create ++ mapValue = map.put (key, censueValue); if (mapvalue! = null) {// Был конфликт, так что отмените, что последнее путем // Если перед ним есть старое значение, Undo put () map.put (key, mapvalue); } else {size += safesizeof (key, censueValue); }} if (mapValue! = null) {intryRemoved (false, key, censueValue, mapValue); вернуть MapValue; } else {trimtoSize (maxSize); вернуть созданную Value; }} /*** Кэши {@code value} для {@code key}. Значение перемещается в голову * очередь. * * @return Предыдущее значение, отображенное {@Code Key}. */ public final v put (k key, v value) {if (key == null || value == null) {бросить новое nullpointerexception ("key == null || value == null"); } V предыдущий; синхронизированный (это) {putcount ++; size += safesizeof (ключ, значение); предыдущий = map.put (ключ, значение); if (предыдущий! = null) {// возвращаемое предыдущее значение -size -= safesizeof (key, предыдущий); }} if (предыдущий! = null) {entryRemoved (false, key, value); } trimtosize (maxSize); вернуть предыдущий; } /*** @param maxsize максимальный размер кэша перед возвращением. Может быть -1 * для выселения ровных элементов размером с 0. * Очистить пространство кеша*/ private void trimtosize (int maxsize) {while (true) {k key; V Значение; Synchronized (this) {if (size <0 || (map.isempty () && size! = 0)) {throw new allogalstateexception (getClass (). getName () + ".Sizeof () - это противоречивые результаты!"); } if (size <= maxSize) {break; } Map.Entry <k, v> toevict = map.eldest (); if (toevict == null) {break; } key = toevict.getKey (); value = toevict.getValue (); map.remove (key); size -= safesizeof (ключ, значение); EvictionCount ++; } intryRemoved (true, ключ, значение, null); }} /*** Удаляет запись для {@Code Key}, если она существует. * Удалить соответствующий элемент кэша клавиши и вернуть соответствующее значение * @return Предыдущее значение, сопоставленное с помощью {@code keo}. */ public final v remove (k key) {if (key == null) {бросить новое nullpointerexception ("key == null"); } V предыдущий; синхронизированный (это) {предыдущий = map.remove (key); if (предыдущий! = null) {size -= safeSizeof (key, предыдущий); }} if (предыдущий! = null) {intryRemoved (false, key, preator, null); } вернуть предыдущий; } /*** Призывали к записям, которые были выселены или удалены. Этот метод * вызывается, когда значение выселяется для освобождения места, удаляемого вызовом * {@link #Remove}, или заменено вызовом {@link #put}. Реализация по умолчанию * ничего не делает. * Вызывается, когда предмет переработан или удален. Измените метод, когда значение переработано, и освобождает пространство для хранения, его называют удалить или когда значение элемента заменяется, реализация по умолчанию ничего не делает. * <p> Метод вызывается без синхронизации: другие потоки могут * получить доступ к кэшу во время выполнения этого метода. * * @param высечен True, если запись удаляется, чтобы устроить место, false * Если удаление было вызвано {@link #put} или {@link #Remove}. * true --- Поместить или удалить причины * @param newvalue Новое значение для {@code key}, если оно существует. Если не null, * это удаление было вызвано {@link #put}. В противном случае это было вызвано * выселением или {@link #Remove}. * / Protected void entremoved (boolean exated, k key, v oldvalue, v newvalue) {} / *** вызывается после промаха кэша для вычисления значения для соответствующего ключа. * Возвращает вычисленное значение или NULL, если значение не может быть вычислено. Реализация * по умолчанию возвращает NULL. * Когда элемент будет потерян, он будет вызван, возвращая рассчитанное соответствующее значение или нулевое * <p> Метод вызывается без синхронизации: другие потоки могут * получить доступ к кэшу во время выполнения этого метода. * * <p> Если значение для {@code keo} существует в кэше, когда этот метод * возвращает, созданное значение будет выпущено с {@link #entryremoviov} * и раскрыта. Это может произойти, когда несколько потоков запрашивают одну и ту же клавишу * одновременно (вызывая создание нескольких значений), или когда один * поток вызывает {@link #put}, в то время как другой создает значение для одного и того же * клавиши. */ Защищенный v Create (k Key) {return null; } private int safesizeof (k -ключ, v value) {int result = sizeof (key, value); if (result <0) {бросить новое allodalstateException ("отрицательный размер:" + key + "=" + value); } return Result; } /** * Возвращает размер записи для {@Code Key} и {@code value} в * пользовательских единицах. Реализация по умолчанию возвращает 1, так что размер * - это количество записей, а максимальный размер - максимальное количество записей. * Возвращает размер пользовательского элемента, возврат по умолчанию 1 представляет количество элементов, максимальный размер-максимальное значение элемента* <p> Размер записи не должен меняться, пока он находится в кэше. */ защищенный int sizeof (k -ключ, v Значение) {return 1; } /*** Очистить кэш, вызовы {@link #EntryRemoved} на каждой удаленной записи. * Clear Cache */ public final void evictall () {trimtosize (-1); // -1 высекает 0 элементов размером с 0} /** * Для кэшей, которые не переопределяют {@link #Sizeof}, это возвращает число * записей в кэше. Для всех других кешей это возвращает сумму * размеров записей в этом кэше. */ public synchronized final int size () {return size; } /** * Для кэшей, которые не переопределяют {@Link #Sizeof}, это возвращает максимальное количество * числа записей в кэше. Для всех других кешей это возвращает * максимальную сумму размеров записей в этом кэше. */ public synchronized final int maxsize () {return maxsize; } /** * Возвращает количество раз {@link #get} возвращал значение, которое * уже присутствовало в кэше. *; } /** * Возвращает количество раз {@link #get} возвращаемое NULL или требуется новое * значение, которое будет создано. */ public synchronized final int misscount () {return misscount; } /*** Возвращает количество раз {@link #create (Object)} возвращал значение. */ public synchronized final int createCount () {return createCount; } /*** Возвращает количество раз {@link #put} было вызвано. */ public synchronized final int putcount () {return putcount; } /*** Возвращает количество значений, которые были выселены. */ public synchronized final int evictionCount () {return evictionCount; } /** * Возвращает копию текущего содержимого кеша, заказанного из наименьшего * недавно доступного в последнее время. Возвращает копию текущего кеша, от наименее недавно доступного до последнего доступного. публичная синхронизированная окончательная карта <K, v> snapshot () {return new LinkedHashmap <K, v> (map); } @Override public synchronized final String toString () {int accesses = hitCount + misscount; int hitpercent = accesses! = 0? (100 * Hitcount / Acceses): 0; return string.format ("lrucache [maxsize =%d, hits =%d, miss =%d, hitrate =%d %%]", maxsize, hitcount, misscount, hitpercent); }}