Безопасно ли использовать ApplicationContext для диалога?
Я запускаю приложение, которое генерирует диалоговое предупреждение изнутри Fragment
в качестве сетевого обратного вызова. Это требует от вас, чтобы перейти в доступный Context
ссылка; так как я использую Fragment
с, я использую getActivity()
, Из-за зависимой от сети природы обратного вызова, getActivity()
может иногда вернутьсяnull
, Это разбивает мой код.
Чтобы обойти эту ошибку, я надеялся предоставить ApplicationContext
в диалоге вместо. Это синглтон, который сохраняется в течение всего срока действия приложения, поэтому я знаю, что оно не будет отозвано. В дополнение Dialog
Содержимое относится к подтверждению платежа, поэтому я считаю, что есть разумные возможности для его отображения без строгой связи с определенным Window
,
Это безопасная реализация? Избегаю ли я неизбежного и должен ли вообще перейти к более устойчивой схеме?
2 ответа
Это безопасная реализация?
ИМХО нет.
Тактически, я ожидаю, что ваше приложение будет аварийно завершать работу в некоторых ситуациях (например, ваше приложение находится в фоновом режиме во время завершения сетевого ввода-вывода), и я ожидаю, что ваше диалоговое окно не обязательно будет соответствовать соответствующей теме. Поскольку кажется, что ваш "диалог" не связан с действием, это должно быть действие в форме действия на основе диалога. Это решает вашу проблему надежности и проблему вашей темы, хотя все еще существует вероятность того, что вы отображаете диалоговое окно (тематическую активность), пока пользователь находится в каком-либо другом приложении, если ваш сетевой ввод-вывод занимает больше времени, чем вы ожидаете.
Стратегически кажется, что вы заботитесь о результатах сетевого ввода-вывода независимо от того, что происходит на уровне пользовательского интерфейса вашего приложения. В этом случае ваш уровень пользовательского интерфейса вашего приложения не должен быть тем, который непосредственно получает результаты сетевого ввода-вывода, и кажется, что ваш фрагмент делает это прямо сейчас. Используйте что-то, что отделено от вашего интерфейса (IntentService
, JobService
голая нить, ThreadPoolExecutor
) для управления сетевым вводом / выводом. Использовать шину событий (LocalBroadcastManager
, EventBus greenrobot), чтобы сообщить уровню пользовательского интерфейса, что сетевой ввод / вывод завершен, и если уровень пользовательского интерфейса не отвечает на событие (потому что он находится в фоновом режиме, и вы обращаете внимание только на события, когда пользовательский интерфейс видим), поднимите Notification
или сделайте что-нибудь еще, чтобы сообщить пользователю о результатах.
Вы должны использовать действие в качестве контекста для своего диалога, потому что диалог является компонентом, который ожидает контекст пользовательского интерфейса. Поэтому, прежде чем показывать диалог, вы можете проверить, добавлен ли текущий фрагмент к его активности с помощью метода isAdded():
if (isAdded()) {
showDialog();
}