2013-06-05 11 views
8

Używam programu Universal Image Loader do wyświetlania obrazów w mojej aplikacji w widokach listy. Używam UnlimitedDiscCache, ponieważ jest to najszybszy mechanizm pamięci podręcznej, zgodnie z dokumentacją.Uniwersalny program ładujący obrazy - ręczne czyszczenie pamięci podręcznej

Chciałbym jednak wyczyścić pamięć podręczną dysku, gdy moja aplikacja jest zamknięta (np. W onStop()), ale należy usunąć tylko najstarsze pliki z pamięci podręcznej, które przekraczają określony limit (jak robi to TotalSizeLimitedDiscCache).

Jestem świadomy ImageLoader.clearDiscCache() ale w moim przypadku to kasuje całą pamięć podręczną, ponieważ używam UnlimitedDiscCache przed ...

Więc chciałbym mieć najszybszy mechanizm pamięci podręcznej, gdy użytkownik jest ładowanie i przewijanie listviews i wyczyść wolną pamięć podręczną, gdy użytkownik nie będzie już wchodził w interakcję z aplikacją.

Jakieś pomysły, w jaki sposób mogę to osiągnąć?

+0

Nie można zagwarantować, że aplikacja zatrzyma się po wywołaniu funkcji 'onStop()'. To mówi tylko, że obecna aktywność jest zatrzymywana. Spadek wydajności jest bardzo minimalny w porównaniu z czasem spędzonym na implementacji innego mechanizmu buforowania (co i tak może spowolnić aplikację). –

+0

@jeff_bordon Czy masz jakiś kod, który jest używany do zbudowania instancji ImageLoader? @Androidy Tak, możesz rozróżnić, kiedy aplikacja się kończy, np. 'If (isFinishing()) {coś}} –

+0

@jeff_bordon możesz mieć BoB (najlepszy z nich). Zobacz źródło tutaj: https://github.com/nostra13/Android-Universal-Image-Loader/blob/master/library/src/com/nostra13/universalimageloader/cache/disc/impl/LimitedAgeDiscCache.java Pisanie UnlimitedAgeDiskCache będzie być całkiem proste. Wszystko, co musisz wiedzieć, to data i różnica między teraz. Myślę, że to nie zmniejszy prędkości ListViews, jeśli jest to kwestia kilku ifs. –

Odpowiedz

1

check to stąd https://stackoverflow.com/a/7763725/1023248 może pomóc ..

@Override 
protected void onDestroy() { 
// closing Entire Application 
android.os.Process.killProcess(android.os.Process.myPid()); 
Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit(); 
editor.clear(); 
editor.commit(); 
trimCache(this); 
super.onDestroy(); 
} 


public static void trimCache(Context context) { 
try { 
    File dir = context.getCacheDir(); 
    if (dir != null && dir.isDirectory()) { 
     deleteDir(dir); 

    } 
} catch (Exception e) { 
    // TODO: handle exception 
} 
} 


public static boolean deleteDir(File dir) { 
if (dir != null && dir.isDirectory()) { 
    String[] children = dir.list(); 
    for (int i = 0; i < children.length; i++) { 
     boolean success = deleteDir(new File(dir, children[i])); 
     if (!success) { 
      return false; 
     } 
    } 
} 

// <uses-permission 
// android:name="android.permission.CLEAR_APP_CACHE"></uses-permission> 
// The directory is now empty so delete it 

return dir.delete(); 
} 
0

Jeśli chcesz wyczyścić pamięć podręczną z pamięci, można użyć następującego kodu:

MemoryCacheUtils.removeFromCache(imageUri, ImageLoader.getInstance().getMemoryCache()); 

Jeśli też chcesz Aby wyczyścić pamięć podręczną na dysku, można użyć następującego kodu:

DiscCacheUtils.removeFromCache(imageUri, ImageLoader.getInstance().getDiscCache()); 

To znacznie prostszy sposób f czyszczenie pamięci podręcznej. możesz znaleźć podobne odpowiedzi w tym wątku:

How to force a cache clearing using Universal Image Loader Android?

Mam nadzieję, że ta informacja była pomocna. :)

Powiązane problemy