Универсальный загрузчик изображений - очистить кеш вручную

Я использую Universal Image Loader для отображения изображений в моем приложении в списках. Я использую UnlimitedDiscCache, так как согласно документации это самый быстрый механизм кэширования.

Однако я хотел бы очистить кеш диска, когда мое приложение закрыто (например, в onStop()), но следует удалять только самые старые кэшированные файлы, превышающие заданный лимит (например, TotalSizeLimitedDiscCache).

Я знаю о ImageLoader.clearDiscCache(), но в моем случае это полностью очищает кеш, так как раньше я использовал UnlimitedDiscCache...

Поэтому я хотел бы иметь самый быстрый механизм кеша, когда пользователь загружает и прокручивает списки, и очищать медленный кеш, когда пользователь больше не взаимодействует с приложением.

Любые идеи, как я могу этого добиться?


person jeff_bordon    schedule 05.06.2013    source источник
comment
Вы не можете гарантировать, что приложение остановится при вызове onStop(). Это говорит только о том, что текущая активность останавливается. Потеря производительности очень минимальна по сравнению со временем, затрачиваемым на реализацию другого механизма кэширования (который в любом случае может замедлить работу приложения).   -  person Austyn Mahoney    schedule 01.08.2013
comment
@jeff_bordon У вас есть код, который используется для создания экземпляра ImageLoader? @Androidy Да, вы можете определить, когда приложение подходит к концу, например if(isFinishing()) { do something}   -  person Nikola Despotoski    schedule 07.08.2013
comment
@jeff_bordon, у тебя может быть BoB (лучшее из обоих). См. исходный код здесь github.com/nostra13/Android-Universal-Image-Loader/blob/master/ Написание UnlimitedAgeDiskCache будет довольно простым. Все, что вам нужно знать, это дату и разницу между настоящим и тогдашним. Я думаю, что это не уменьшит скорость ListViews, если это вопрос нескольких ifs.   -  person Nikola Despotoski    schedule 07.08.2013
comment
isFinishing() говорит только о том, что останавливается текущая активность, а не приложение. Если вы используете только один Activity, конечно, но в противном случае у вас будут проблемы.   -  person Austyn Mahoney    schedule 07.08.2013


Ответы (2)


проверьте это отсюда https://stackoverflow.com/a/7763725/1023248 может вам помочь..

@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();
}
person Deepak Swami    schedule 07.08.2013

Если вы хотите очистить кеш из памяти, вы можете использовать следующий код:

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

Если вы также хотите очистить кеш на диске, вы можете использовать следующий код:

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

Это гораздо более простой способ очистки кеша. Аналогичные ответы можно найти в этой теме:

Как принудительно очистить кеш с помощью Universal Image Loader Андроид?

Я надеюсь, что эта информация была полезной. :)

person Cyril Noah    schedule 22.08.2016