たとえば、キャッシュネットワークの読み込み写真:
//アプリケーションで割り当てられた最大メモリを取得int maxmemory =(int)runtime.getRuntime()。maxmemory(); //キャッシュサイズがint cachesize = maxmemory/5の場合に使用するメモリの1/5を取得します。 // instant lrucache lrucache = new lrucache <string、bitmap>(cachsize){//内部メソッドsizeof各画像のキャッシュサイズを設定します。 value.getByteCount(); }};上記のコードは通常、初期化方法に配置されます
実際、Lurcacheクラスはマップクラスマップとして理解できます。メソッドと取得方法があります
次に、putを呼び出して、キャッシュされたリソースにアクセスする方法を取得します
lurcache's add:
public void putbitmaptocache(string url、bitmap bitmap){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)は1回しか新しいものではないことに注意してください。
AndroidのLrucacheクラスが付属しています
パッケージandroid.util; java.util.linkedhashmapをインポートします。 java.util.mapをインポートします。 /***限られた数の値を強く参照するキャッシュ。毎回 *値にアクセスすると、キューの頭に移動されます。値が完全なキャッシュに *追加されると、そのキューの最後の値が排除され、ガベージコレクションの対象となる可能性があります。 *キャッシュは、コンテンツの数を制限するための強力な参照を保存します。アイテムにアクセスするたびに、アイテムはキューの頭に移動します。 *キャッシュがいっぱいになったときに新しいアイテムが追加されると、キューの最後のアイテムがリサイクルされます。 * <p>キャッシュされた値が明示的にリリースされる必要があるリソースを保持している場合、 * Override {@link #entryRemoved}。 *対応するキーに対してキャッシュミスを要求する必要がある場合、 * Override {@link #create}。これにより、呼び出しコードが簡素化され、キャッシュミスがある場合でも、値が常に返されると想定します。 *キーに対応するアイテムが紛失した場合、create()を書き直します。これにより、呼び出しコードが単純化され、失われたとしても常に返されます。 * <p>デフォルトでは、キャッシュサイズはエントリの数で測定されます。オーバーライド * {@link #sizeof}は、異なるユニットのキャッシュをサイズします。たとえば、このキャッシュ *は4MIBのビットマップに制限されています。デフォルトのキャッシュサイズは測定されたアイテムの数であり、キャッシュのサイズは、異なるアイテムの *サイズを計算するためにオーバーライドされます。 * <pre> {@code * int cachesize = 4 * 1024 * 1024; // 4mib * lrucache <string、bitmap> bitmapcache = new lrucache <string、bitmap>(cachesize){ * protected int sizeof(string key、bitmap value){ * return value.getBytecount(); *} *}} </pre> * * <p>このクラスはスレッドセーフです。キャッシュを同期することにより、複数のキャッシュ操作を原子的に実行します:<pre> {@code * synchronized(cache){ * if(cache.get(key)== null){ * cache.put(key、value); *} *}} </pre> * * <p>このクラスでは、nullをキーまたは値として使用することはできません。 {@link #get}、{@link #put}または{@link #Remove}からのnullのnullの値は *明確です。キーはキャッシュにはありませんでした。 * keyまたはvalueはnull * get()、put()、remove()return値はnull、キーの対応するアイテムはキャッシュにありません */ public class lrucache <k、v> {private linkedhashmap <k、v> map; /**ユニットのこのキャッシュのサイズ。必ずしも要素の数ではありません。 */ private int size; // Private Int Maxsizeに保存されているサイズ。 //指定された最大ストレージスペースプライベートInt PutCount。 // Put Private Int CreateCountの数。 // private private int evictioncountの作成時間数。 //リサイクルされたプライベートint int hitcountの回数。 // HITS PRIVATE INT MISSCOUNTの数。 // lostの数/** * @param maxsize {@link #sizeof}をオーバーライドしないキャッシュの場合、これはキャッシュの最大エントリの数です。他のすべてのキャッシュの場合 *これは、このキャッシュのエントリのサイズの最大合計です。 */ public lrucache(int maxsize){if(maxsize <= 0){throw new IllegalargumentException( "maxsize <= 0"); } this.maxsize = maxsize; this.map = new linkedhashmap <k、v>(0、0.75f、true); } /** * {@code key}の値をキャッシュに存在する場合、または{@code #create}で作成できる場合は{@code key}を返します。値が返された場合、キューの *ヘッドに移動します。これにより、値がキャッシュされておらず、作成できない場合にnullが返されます。対応するアイテムをキーで返すか、対応するアイテムを返します。対応するアイテムは、キューのヘッドに移動します。 *アイテムの値がキャッシュされていないか、作成できない場合は、nullを返します。 */ public final v get(k key){if(key == null){throw new nullpointerexception( "key == null"); } v MapValue;同期(this){mapvalue = map.get(key); if(mapvalue!= null){hitcount ++; // return mapvalueをヒットします。 } misscount ++; // lost} / * *値を作成しようとします。これには長い時間がかかる場合があり、create()が返されるとマップ *が異なる場合があります。 create()が機能している間に矛盾する値がマップに追加された場合、その値はマップに残し、作成された値をリリースします。 *欠落している場合は、アイテムを作成してみてください */ v createdValue = create(key); if(createdValue == null){return null; } synchronized(this){createcount ++; // create ++ mapvalue = map.put(key、createdValue); if(mapvalue!= null){//競合があるので、最後に元に戻す//それ以前に古い値がある場合、undo put()map.put(key、mapvalue); } else {size += safesizeof(key、createdValue); }} if(mapValue!= null){entremoved(false、key、createdValue、mapValue); MapValueを返します。 } else {trimtosize(maxsize); return createdValue; }} /*** {@code key}のcaches {@code値}。値は *キューの頭に移動します。 * * @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 += safesizeof(key、value);前= map.put(key、value); if(前!= null){//返された以前の値はsize- = sefesizeof(key、forter); }} if(forter!= null){enterremoved(false、key、forter、value); } trimtosize(maxsize);以前に戻ります。 } /*** @paramは、戻る前にキャッシュの最大サイズを最大化します。 0サイズの要素を追い出すために-1 *である可能性があります。 *クリアキャッシュスペース*/ private void trimtosize(int maxsize){while(true){k key; v値;同期(this){if(size <0 ||(map.isempty()&& size!= 0)){throw new IllegalStateException(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);サイズ - =金庫の(key、value); evictionCount ++; } enterremoved(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){forter = map.remove(key); if(前!= null){size- = safesizeof(key、forter); }} if(前!= null){entremoved(false、key、forter、null); }前に返します。 } /*** revided revictedまたは削除されたエントリが求められました。このメソッドは、値を追い出されてスペースを作成したときに呼び出され、 * {@link #Remove}への呼び出しによって削除されるか、{@link #put}への呼び出しで置き換えられます。デフォルト *実装は何もしません。 *アイテムがリサイクルまたは削除されたときに呼び出されます。メソッドを変更して、値がリサイクルされ、ストレージスペースを解放する場合、削除と呼ばれます。または、アイテム値が置き換えられた場合、デフォルトの実装は何もしません。 * <p>このメソッドは同期なしに呼び出されます。他のスレッドは、このメソッドが実行されている間にキャッシュにアクセスする場合があります。 * * @paramは、スペースを作成するためにエントリが削除されている場合、false *を排除しました。 * true ---原因をputまたは削除 * @param newValue {@code key}の新しい値が存在する場合。非ヌルの場合、 *この削除は{@link #put}によって引き起こされました。それ以外の場合は、 * evictionまたは{@link #Remove}によって引き起こされました。 * /保護されたvoid entremoved(boolean evicted、k key、v oldvalue、v newValue){} / ***キャッシュミス後に呼び出されて、対応するキーの値を計算します。 *値を計算できない場合は、計算された値またはnullを返します。 *デフォルトの実装はnullを返します。 *アイテムが失われると呼び出され、計算された対応する値またはnullを返します * <p>メソッドは同期なしで呼び出されます。他のスレッドは、このメソッドが実行されている間にキャッシュにアクセスする場合があります。 * * <p> {@code key}の値がキャッシュに存在する場合、この方法 *が返されると、作成された値は{@link #entryRemoved} *でリリースされ、開示されます。これは、複数のスレッドが同じキー *を同時に要求する(複数の値を作成する)、または1つのスレッドが{@link #put}を呼び出している場合、別のスレッドが同じ *キーの値を作成している場合に発生します。 */ protected v create(k key){return null; } private int safesizeof(k key、v value){int result = sizeof(key、value); if(result <0){新しいIllegalStateException( "負のサイズ:" + key + "=" + value); } return result; } /** *ユーザー定義ユニットの{@code key}および{@code値}のエントリのサイズを返します。デフォルトの実装は1を返し、サイズ *がエントリの数であり、最大サイズはエントリの最大数です。 *ユーザー定義のアイテムのサイズを返し、デフォルトの返品1はアイテムの数を表します。最大サイズは最大アイテム値です* <p>キャッシュ中はエントリのサイズを変更してはなりません。 */保護されたint sizeof(k key、v value){return 1; } /***削除された各エントリで{@link #entryRemoved}を呼び出すキャッシュをクリアします。 *クリアキャッシュ */ public final void evictall(){trimtosize(-1); // -1は0サイズの要素を排除します} /** * {@link #sizeof}をオーバーライドしないキャッシュの場合、これはキャッシュ内のエントリの数 *を返します。他のすべてのキャッシュについて、これにより、このキャッシュのエントリのサイズ *の合計が返されます。 */ public同期最終int size(){return size; } /** * {@link #sizeof}をオーバーライドしないキャッシュの場合、これにより、キャッシュのエントリの最大数が返されます。他のすべてのキャッシュについて、これにより、このキャッシュのエントリのサイズの最大合計が返されます。 */ public Synchronized final int maxsize(){return maxsize; } /** * {@link #get}の回数を返し、キャッシュに既に存在する値を返しました。 */ public同期final int hitcount(){return hitcount; } /** * nullを返した回数{@link #get}の回数を返すか、作成するために新しい *値を必要とします。 */ public Synchronized final int misscount(){return misscount; } /*** {@link #create(object)}の回数を返します。値を返します。 */ public同期final int createcount(){return createcount; } /***呼び出された回数{@link #put}を返します。 */ public同期final int putcount(){return putcount; } /***立ち退きされた値の数を返します。 */ public Synchronized final intevictionCount(){return evictioncount; } /** *最近アクセスされた最近アクセスされた最近のアクセスから注文されたキャッシュの現在の内容のコピーを返します。現在のキャッシュのコピーを、最近アクセスしたものから最近アクセスしたものに戻ります。 public同期最終マップ<k、v> snapshot(){return new linkedhashmap <k、v>(map); } @Override public synchronized final String toString(){int Accesses = hitcount + misscount; int hitpercent =アクセス!= 0? (100 * hitCount / Access):0; return string.format( "lrucache [maxsize =%d、hits =%d、miss =%d、hitrate =%d %%]"、maxsize、hitcount、misscount、hitpercent); }}