Вот несколько различий между ними:
- Кеш объекта быстрее, чем внутреннее хранилище, но имеет меньшую емкость.
- Кэш объектов носит временный характер, в то время как внутреннее хранилище имеет более длительный срок службы
- Кэш объектов занимает фактическое пространство в куче.Внутренняя память неЭто важный момент, так как слишком большой кэш вашего объекта может вызвать исключение OutOfMemoryException даже с SoftReference
Теперь, учитывая эти различия, они не являются полностью взаимоисключающими.Многое из того, что мы реализовали, использует многослойное кэширование, особенно связанное с загрузкой изображений.Вот шаги, которые мы используем:
- Если изображение не было кэшировано, извлеките его из URL и кэшируйте его в кеше первого уровня, который представляет собой SoftReference / WeakHashMap или даже жесткий кеш с ограниченным размеромиспользуя LinkedHashMap
- Затем мы реализуем метод removeEldestEntry () в LinkedHashMap.При достижении емкости жесткого кеша мы перемещаем вещи во вторичный кеш, который является внутренним хранилищем.Используя этот метод, вам не нужно повторно извлекать изображение из URL-адреса + оно все равно будет быстрее и освободит вашу память
- Мы своевременно провели очистку на фоне внутреннего хранилища с использованием алгоритма LRU,Вы не должны полагаться на Android, чтобы очистить это для вас.
Мы сделали многоуровневое кэширование общим компонентом и использовали его во многих наших проектах для наших клиентов.Эта техника в значительной степени соответствует тому, что кэш L1, L2 в компьютерной архитектуре.