LruCache funktioniert nicht

final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); final int cacheSize = maxMemory / 8; mMemoryCache = new LruCache<String, Bitmap>(cacheSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { // The cache size will be measured in kilobytes rather than // number of items. return bitmap.getByteCount() / 1024; } }; URL url = new URL("http://s2.goodfon.ru/image/260463-1920x1200.jpg"); Bitmap bitmap = BitmapFactory.decodeStream((InputStream) url.getContent(), null, options); if(bitmap != null) Log.i("Success", "BITMAP IS NOT NULL"); String key = "myKey"; Log.i("Get is null", "putting myKey"); mMemoryCache.put(key, bitmap); Bitmap newBitmap = mMemoryCache.get(key); if(newBitmap == null) Log.i("newBitmap", "is null"); 

Hallo, hier ist ein Code. Ich bekomme Bitmap von URL erfolgreich (Log sagt Bitmap ist nicht null und ich kann es einfach anzeigen). Dann versuche ich es in LruCache zu setzen und es zurückzuholen, aber es kommt null zurück. (Log sagt, dass newBitmap null ist). Wo ist mein Fehler? Erzähl es mir bitte. Android 4.1.2 Cache Größe 8192 Kb.

  • Wie man onActivityResult (..) verwendet, wenn die Aktivität aus einem Menü aufgerufen wird
  • Ich bekomme "Fehler: Keine Ressource gefunden, die mit dem Vornamen übereinstimmt (bei Wert mit Wert @ Integer / google_play_services_version)"
  • Veröffentlichen von mehreren apks mit verschiedenen Filtern für Handy und TV
  • Wie kann ich meinen Bildschirm beim USB-Debugging entsperrt halten?
  • Ich / Kunst: Kann nicht finden Klasse:
  • Unterschied zwischen setAlpha und setImageAlpha
  • Wie man Android's nativen Browser (nicht Chrome) auf einem Desktop-Computer zu debuggen?
  • Collapse alle Gruppe außer ausgewählte Gruppe in erweiterbare listview android
  • Wie man die Kamera-Taste von Google Glass überschreibt
  • Android-Verschleißprojekt mit 3 Geschmacksrichtungen, 3 buildTypes und 2 applicationIdSuffixes
  • Cordova - Android-Updates (Freeze-Versionen)
  • Äquivalent von CSS-Klassenselektoren für Android-Ansichten?
  • 3 Solutions collect form web for “LruCache funktioniert nicht”

    Wenn es 1,19 MB auf Festplatte aber ~ 9 MB im Speicher ist, bedeutet das, dass als komprimierte JPEG-Datei, es ist 1,19 MB und sobald Sie das in eine Bitmap (unkomprimiert), die angezeigt werden kann, extrahiert, wird es 9 MB im Speicher aufnehmen . Wenn es ein 1920 x 1200 Pixel Bild ist, wie es von der URL in Ihrem Code-Snippet vorgeschlagen wird, nimmt das Bild 1920 x 1200 x 4 Bytes Speicher auf (4 Bytes für jedes Pixel, um ARGB-Werte von 0 bis 256 mal 2,3 Millionen Gesamtpixel darzustellen = 9.216.000 Bytes). Wenn du 1/8 deines verfügbaren Speichers für diesen Cache einsetzst, ist es möglich / wahrscheinlich, dass 9MB diesen Gesamtspeicherplatz übersteigt, so dass die Bitmap es niemals in den Cache bringt oder sofort ausgetauscht wird.

    Sie werden wahrscheinlich wollen, um das Bild zu decodieren Zeit, wenn es so groß ist (mit BitmapFactory.Options.inSampleSize … viel von Dokumentationen im Web für die Verwendung, wenn Sie nicht bereits vertraut sind).

    Außerdem verwenden Sie Runtime.maxMemory, um Ihre Cachegröße zu berechnen. Dies bedeutet, dass Sie die maximale Menge an Speicher anfordern, die die gesamte VM verwenden darf.

    http://developer.android.com/reference/java/lang/Runtime.html#maxMemory%28%29

    Der häufigere Ansatz ist die Verwendung der Wert, der Ihnen von der ActivityManager.getMemoryClass () Methode zurückgegeben wird.

    Hier ist ein Beispielcode-Snippet und die Methodendefinition in den Dokumenten als Referenz.

      ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); int memClassBytes = am.getMemoryClass() * 1024 * 1024; int cacheSize = memClassBytes / 8; mMemoryCache = new LruCache<String, Bitmap>(cacheSize) 

    http://developer.android.com/reference/android/app/ActivityManager.html#getMemoryClass%28%29

    Du kannst auch Bitmaps recyceln, die aus lrucache herausspringen

     final Bitmap bmp = mLruCache.put(key, data); if (bmp != null) bmp.recycle(); 

    Das Android-Beispiel war falsch beim Aufteilen von Runtime maxMemory um 1024 in der folgenden Zeile:

     final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); 

    Die Einheit des maxMemory ist Byte, die mit dem 'cacheSize' gleich ist ('/ 8' bedeutet nur, dass es das achte des verfügbaren Speichers der aktuellen Aktivität verwendet). Deshalb wird '/ 1024' den 'CacheSize' extrem klein machen, so dass keine Bitmap tatsächlich in 'mMemoryCache' 'zwischengespeichert' werden kann.

    Die Lösung wird im obigen Code gelöscht.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.