Итак, я закончил проект, теперь главная проблема, с которой я столкнулся, - это Утечка памяти в приложении ( "утечка" означает, что вы сохраняете ссылку на активность, тем самым предотвращая GC от его сбора)
В некоторых случаях я обнаружил, что происходит утечка памяти:
Контекст утечки
Это происходит из-за долговечной ссылки на контекст активности.
Хорошим примером этого я нашел здесь,
private static Drawable sBackground;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
TextView label = new TextView(this);
label.setText("Leaks are bad");
if (sBackground == null) {
sBackground = getDrawable(R.drawable.large_bitmap);
}
label.setBackgroundDrawable(sBackground);
setContentView(label);
}
здесь проблема заключается в private static Drawable sBackground;
. Статический Drawable создается с помощью Activity как контекста, поэтому в случае THAT есть статическая ссылка на Drawable, которая ссылается на Activity, и на то, почему там происходит утечка. Пока эта ссылка существует, активность будет храниться в памяти, утечка всех ее представлений.
Изменение ориентации экрана
Второй случай, который привлекает внимание, - это изменение ориентации экрана. Когда меняется ориентация экрана, система по умолчанию уничтожает текущую активность и создает новую, сохраняя ее состояние. При этом Android перезагрузит пользовательский интерфейс приложений из ресурсов. Теперь представьте, что вы написали приложение с большим растровым изображением, которое вы не хотите загружать при каждом повороте.
Это приведет к большому количеству утечек памяти, так как могут быть большие битмапы для загрузки.
Контекст-активности
Третий случай, я нашел ссылку на контекст активности. Это также приводит к утечке памяти.
Интересно, есть ли простой способ избежать таких утечек памяти из происходит. или если может быть инструмент для проверки и удаления этих утечки памяти из приложения.