Таким образом, одна из проблем на Android - это различные спецификации устройства (в частности, память устройства).
Я написал объекты модели, чтобы широко использовать Java SoftReferences
в режиме ленивой загрузки, поэтому виртуальная машина может обрезать не используемые в настоящее время части модели данных по своему усмотрению, и они просто восстанавливаются по мере необходимости.
Однако, одна задача на практике с SoftReferences
заключается в том, что они, как правило, очищаются в течение нескольких секунд после того, как они слабо ссылаются, а не висят вокруг до тех пор, пока виртуальная машина не станет низкой в памяти, поэтому они хорошо работают с точки зрения разрешения модель для обрезки, но они не работают, так как часто это означает, что в памяти ничего нет. В идеале на устройстве с большим количеством памяти вы позволите пользователю воспользоваться сохранением объектов в памяти.
В результате обычно объединяется SoftReferences
с механизмом LRU, где LRU сохраняет жесткий указатель на объекты, на которые ссылаются недавно ссылки. Это, конечно, не идеально, поскольку предполагает, что у вас достаточно памяти для всех этих объектов с ограниченными объектами.
Это также бросает вызов узнать, что является хорошим по умолчанию для LRU.
В идеальном мире Android будет использовать обратный вызов с низкой памятью в качестве подсказки (так что я мог бы начать с небольшого LRU и периодически поднимать его до тех пор, пока не начнутся обратные вызовы с низкой памятью, а затем верните его, чтобы найти хорошее значение для устройство), но, по моему опыту, этот обратный вызов никогда не совпадает с фактическим давлением памяти виртуальной машины.
Кто-нибудь может найти разумный способ обнаружить, что ваша модель данных использует слишком много памяти на определенном устройстве?