예를 들어, 캐시 네트워크로드 사진 :
// 응용 프로그램에 의해 할당 된 최대 메모리를 가져옵니다 int maxMemory = (int) runtime.getRuntime (). maxMemory (); // 캐시 크기가 int cachesize = maxmemory/5 일 때 사용할 메모리의 1/5을 가져옵니다. // Instant lrucache lrucache = new lrucache <string, bitmap> (cachsize) {// 내부 메소드 크기는 각 이미지 보호 된 int sizeof (String key, bitmap 값)의 캐시 크기를 설정합니다. {// 캐시가 시스템에 얼마나 큰지 알려주기 위해 캐시가 얼마나 큰지 알려주는지 알 수 있습니다. value.getByteCount (); }}; 위의 코드는 일반적으로 초기화 방법에 배치됩니다.
실제로 Lurcache 클래스는 MAP 클래스 맵으로 이해 될 수 있습니다. 풋 앤 get 방법이 있습니다
다음으로 전화를 걸고 캐시 된 리소스에 액세스하는 방법을 얻으십시오.
Lurcache의 추가 :
public void putbitmaptocache (문자열 URL, 비트 맵 비트 맵) {if (getBitMapFromCache (url) == null) {// 현재 캐시가 lrucache.put (url, bitmap)인지 판단합니다. }} lurcache get : public bitmap getbitmap fromcache (string url) {return lrucache.get (url); // lrucache는 맵으로 간주 될 수 있습니다} 위의 추가 및 가져 오기 메소드를 호출하면 자원이 캐시 할 수 있습니다. 이는 매우 간단합니다.
그러나 LruCache lruCache=new LruCache<String, Bitmap>(cachSize) 한 번만 새로운 것이 될 수 있습니다. 그렇지 않으면 다른 물체가 다르게 캐싱됩니다.
Android의 Lrucache 클래스와 함께 첨부
패키지 android.util; java.util.linkedhashmap import; java.util.map import; /*** 제한된 수의 값에 대한 강력한 참조를 보유하는 캐시. 값이 액세스 할 때마다 큐 헤드로 이동됩니다. 값이 전체 캐시에 * 추가되면 해당 대기열의 끝의 값이 퇴거되고 쓰레기 수집 자격이 될 수 있습니다. * 캐시는 내용 수를 제한하기 위해 강력한 참조를 저장합니다. 항목에 액세스 할 때마다 항목이 큐 헤드로 이동합니다. * 캐시가 가득 차면 새 항목이 추가되면 큐 끝의 항목이 재활용됩니다. * <p> 캐시 된 값이 명시 적으로 릴리스되어야하는 리소스를 보유하고 있다면 * {@link #EntReyRemoved}를 재정의하십시오. * 해당 키에 대한 캐시 미스를 주문시 계산 해야하는 경우 * {@link #create}를 재정의하십시오. 이것은 호출 코드를 단순화하여 캐시 미스가있을 때에도 값이 항상 반환 될 것이라고 가정 할 수 있습니다. * 키에 해당하는 항목이 손실되면 Create ()를 다시 작성하십시오. 이것은 호출 코드를 단순화하며 손실 된 경우에도 항상 반환됩니다. * <p> 기본적으로 캐시 크기는 항목 수에서 측정됩니다. * {@link #sizeof}를 재정의하여 캐시를 다른 단위로 크기를 크기로 바꿉니다. 예를 들어,이 캐시 *는 비트 맵의 4mib로 제한됩니다. 기본 캐시 크기는 측정 된 항목의 수이며 캐시의 크기는 다른 항목의 * 크기를 계산하기 위해 비정규입니다. * <fre> {@code * int cachesize = 4 * 1024 * 1024; // 4mib * lrucache <string, bitmap> bitmapcache = new lrucache <string, bitmap> (cachesize) { * protected int sizeof (문자열 키, 비트 맵 값) { * return value.getByTeCount (); *} *}}} </pre> * * <p>이 클래스는 스레드-안전입니다. 캐시에서 * 동기화 * 동기화하여 여러 캐시 작업을 원자로 수행하십시오. *} *}}} </pre> * * <p>이 클래스는 NULL이 키나 값으로 사용될 수 없습니다. {@link #get}, {@link #put} 또는 {@link #remove}에서 null의 반환 * 값은 * 명확하지 않습니다 : 키는 캐시에 있지 않았습니다. * 키 또는 값은 null입니다. /**이 캐시의 크기 단위. 반드시 요소 수는 아닙니다. */ 개인 int 크기; // 개인 int maxsize에 저장된 크기; // 지정된 최대 저장 공간 개인 int putcount; // PUT PUT PRIBAL INT CreateCount의 수; // 비공개 evictioncount 생성의 횟수; // 재활용 된 개인 int int hitCount의 횟수; // 히트 횟수 개인 int MissCount; // {@link #sizeof}를 재정의하지 않는 캐시의 경우 손실 된/** * @param maxsize의 수는 * 캐시의 최대 항목 수입니다. 다른 모든 캐시의 경우 * 이것은이 캐시의 항목 크기의 최대 합입니다. */ public lrucache (int maxsize) {if (maxsize <= 0) {새로운 불법 불법 행위 ( "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 (키); if (mapValue! = null) {HitCount ++; // 반환 mapValue를 누르십시오. } MissCount ++; // lost} / * * 값을 만들려고 시도합니다. 시간이 오래 걸릴 수 있으며 Create ()가 반환 할 때 맵 *이 다를 수 있습니다. Create ()가 작동하는 동안 충돌 값이 맵에 추가 된 경우, 우리는 그 값을 * 맵에 남겨두고 생성 된 값을 해제합니다. * 누락 된 경우 항목을 작성하십시오 */ v createvalue = create (key); if (createdValue == null) {return null; } synchronized (this) {createCount ++; // create ++ mapValue = map.put (key, createdValue); if (mapValue! = null) {// 충돌이 있었으므로 마지막 putt // 이전에 OldValue가 있으면 put () map.put (key, mapvalue); } else {size += safesizeof (key, createdValue); }} if (mapValue! = null) {EntryRemoved (false, key, createValue, mapValue); MapValue를 반환하십시오. } else {trimTosize (maxSize); RETURN BREADVALUE; }} /*** {@code key}의 {@code value} 캐시. 값은 대기열의 헤드로 옮겨집니다. * * @return {@code key}에 의해 맵핑 된 이전 값. */ public final v put (k key, v value) {if (key == null || value == null) {throw new nullpointerexception ( "key == null || value == null"); } v 이전; 동기화 (this) {putcount ++; size += safesize (키, 값); previous = map.put (키, 값); if (previous! = null) {// 이전 값은 size- = safesize (key, previous)입니다. }} if (previous! = null) {EntryPremoved (false, key, previous, value); } trimTosize (maxSize); 이전에 반환; } /*** @Param은 반환하기 전에 캐시의 최대 크기를 최대 크기로 표시합니다. 0 크기의 요소를 퇴거시키기 위해 -1 * 일 수 있습니다. * CLEAR CACHE SPACE*/ private void trimTosize (int maxSize) {while (true) {k 키; v 값; synchronized (this) {if (size <0 || (map.isempty () && size! = 0)) {throw new new OregalStateException (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 (키); 크기 -= SAFESIZE (키, 값); evicioncount ++; } EntryEtremoved (true, key, value, null); }} /*** {@code key}에 대한 항목이 존재하는 경우. * 키의 해당 캐시 항목을 삭제하고 해당 값 * @return {@code key}에 의해 매핑 된 이전 값을 반환합니다. */ public final v remove (k key) {if (key == null) {throw new nullpointerexception ( "key == null"); } v 이전; 동기화 (this) {previous = map.remove (키); if (previous! = null) {size- = safesizeof (key, previous); }} if (previous! = null) {EntryPremoved (false, key, previous, null); } 이전 이전; } /*** 퇴거 또는 제거 된 항목을 요구합니다. 이 메소드는 값이 공간을 만들기 위해 퇴거되거나 * {@link #remove}에 대한 호출로 제거되거나 {@link #put}로 호출로 대체 될 때 * 호출됩니다. 기본 * 구현은 아무것도하지 않습니다. * 항목이 재활용되거나 삭제 될 때 호출됩니다. 값이 재활용되고 저장 공간을 해방시킬 때 메소드를 변경하고 제거라고하거나 항목 값을 교체 할 때 기본 구현은 아무것도 수행하지 않습니다. * <p> 메소드는 동기화없이 호출됩니다.이 메소드가 실행되는 동안 다른 스레드가 캐시에 액세스 할 수 있습니다. * * @param은 {@link #put} 또는 {@link #remove}에 의해 제거 된 경우 항목이 공간을 만들기 위해 제거되면 False *를 제거하면 TRUE를 퇴거 시켰습니다. * true --- 원인을 넣거나 제거하십시오. Null이 아닌 경우 *이 제거는 {@link #put}에 의해 발생했습니다. 그렇지 않으면 * 퇴거 또는 {@link #Remove}에 의해 발생했습니다. * / 보호 된 void EntryPertremoved (부울 퇴거, K 키, v OldValue, v NewValue) {} / *** 캐시 미스 후 호출하여 해당 키의 값을 계산합니다. * 값을 계산할 수없는 경우 계산 된 값 또는 NULL을 반환합니다. * 기본 구현은 NULL을 반환합니다. * 항목이 손실되면 호출되면 계산 된 해당 값 또는 NULL * <P> 메소드가 동기화없이 호출됩니다.이 메소드가 실행되는 동안 다른 스레드가 캐시에 액세스 할 수 있습니다. * * * <p>이 메소드 *가 반환 될 때 {@code key} 값이 캐시에 존재하면 생성 된 값은 {@link #entremoved} *로 릴리스되고 공개됩니다. 여러 스레드가 동일한 키 *를 동시에 (여러 값을 생성하는 경우) 또는 한 스레드가 {@link #put}을 호출하고 다른 스레드가 동일한 * 키에 대한 값을 생성 할 때 발생할 수 있습니다. */ protected v create (k key) {return null; } private int safesize (k key, v value) {int result = sizeof (키, 값); if (result <0) {새로운 불법 스테이트 exception ( "음수 크기 :" + key + "=" + value); } 반환 결과; } /** * 사용자 정의 장치에서 {@code key} 및 {@code value}에 대한 항목의 크기를 반환합니다. 기본 구현은 1을 반환하여 크기 *가 항목 수이고 최대 크기는 최대 항목 수입니다. * 사용자 정의 항목의 크기를 반환하고, 기본 반품 1은 항목 수를 나타내고, 최대 크기는 최대 항목 값* <p> 캐시에있는 동안 항목의 크기가 변경되지 않아야합니다. */ 보호 된 int sizeof (k key, v value) {return 1; } /*** 캐시를 지우고 제거 된 각 항목에서 {@Link #EntReyRemoved}를 호출하십시오. * 클리어 캐시 */ public final void evictall () {trimtosize (-1); // -1은 {@link #sizeof}를 무시하지 않는 캐시의 경우 0 크기의 요소} /** *를 퇴거시킵니다. 이는 캐시의 항목 번호 *를 반환합니다. 다른 모든 캐시의 경우이 캐시의 항목 크기의 합을 반환합니다. */ public synchronized final int size () {return size; } /** * {@link #sizeof}를 무시하지 않는 캐시의 경우 캐시의 최대 * 항목 수를 반환합니다. 다른 모든 캐시의 경우이 캐시의 항목 크기의 최대 합을 반환합니다. */ public synchronized final int maxsize () {return maxsize; } /** * {@link #get}의 횟수를 반환합니다. 캐시에 이미 존재하는 값을 반환했습니다. */ public synchronized final int hitcount () {return hitCount; } /** * {@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; } /** * 캐시의 현재 내용 사본을 반환합니다. 가장 최근에 액세스 한 것에서 가장 최근에 액세스 된 액세스에 이르기까지 현재 캐시의 사본을 반환합니다. public synchronized final map <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 / Accesses) : 0; return string.format ( "lrucache [maxsize =%d, hits =%d, misses =%d, hitrate =%d %%]", maxsize, hitcount, misscount, hitpercent); }}