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.

  • Definiere buildconfigfield für einen bestimmten Geschmack AND buildType
  • NotifyDataSetChange funktioniert nicht vom benutzerdefinierten Adapter
  • Wie kann ich meinen BroadcastReceiver am Leben erhalten?
  • Hinzufügen von Cc-, Bcc- und Subject-Feldern zu einer Nachricht in einer E-Mail, die eine Android-App sendet
  • Telefoncode mit Android abrufen
  • Verwenden Sie das Theme-Kombinationsfeld über dem Layout, um ein anderes Layout auszuwählen oder die Themenstilreferenzen zu beheben
  • CollapsingToolbarLayout erkennt kein Blättern
  • Wie kann man das Schubladenlayout von einer Seite aus deaktivieren?
  • Wie zu speichern / wiederherstellen globale Variablen in Android, auch wenn os töten Anwendung
  • Android Spinner Feuerereignis, wenn gleiche Artikelauswahl gemacht wird
  • Send Post Request mit Params mit Retrofit
  • Kopiere die datenbank auf sdcard in android
  • 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.