Моя активность пытается создать AlertDialog, который требует контекста в качестве параметра. Это работает, как ожидается, если я использую:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
Однако я не могу использовать "this" в качестве контекста из-за потенциальной утечки памяти, когда Activity уничтожается и воссоздается даже во время чего-то простого, подобного вращению экрана. Из связанного сообщения в блоге разработчиков Android:
Существует два простых способа избежать утечек памяти, связанных с контекстом. Самое очевидное - избегать выхода из контекста вне его собственной сферы. В приведенном выше примере показан случай статической ссылки, но внутренние классы и их неявная ссылка на внешний класс могут быть одинаково опасными. Второе решение - использовать контекст приложения. Этот контекст будет жить до тех пор, пока ваше приложение будет живым и не будет зависеть от жизненного цикла деятельности. Если вы планируете хранить долгоживущие объекты, которым нужен контекст, запомните объект приложения. Вы можете легко получить его, вызвав Context.getApplicationContext() или Activity.getApplication().
Но для AlertDialog()
нельзя использовать getApplicationContext()
или getApplication()
как Контекст, поскольку он генерирует исключение:
"Невозможно добавить нулевой токен окна не для приложения"
Итак, следует ли это считать "ошибкой", так как нам официально рекомендуется использовать Activity.getApplication()
, и все же он не работает так, как рекламируется?
Джим