Безопасно ли использовать ApplicationContext для диалога?

Я запускаю приложение, которое генерирует диалоговое предупреждение изнутри Fragment в качестве сетевого обратного вызова. Это требует от вас, чтобы перейти в доступный Context ссылка; так как я использую Fragmentс, я использую getActivity(), Из-за зависимой от сети природы обратного вызова, getActivity() может иногда вернутьсяnull, Это разбивает мой код.

Чтобы обойти эту ошибку, я надеялся предоставить ApplicationContext в диалоге вместо. Это синглтон, который сохраняется в течение всего срока действия приложения, поэтому я знаю, что оно не будет отозвано. В дополнение DialogСодержимое относится к подтверждению платежа, поэтому я считаю, что есть разумные возможности для его отображения без строгой связи с определенным Window,

Это безопасная реализация? Избегаю ли я неизбежного и должен ли вообще перейти к более устойчивой схеме?

2 ответа

Решение

Это безопасная реализация?

ИМХО нет.

Тактически, я ожидаю, что ваше приложение будет аварийно завершать работу в некоторых ситуациях (например, ваше приложение находится в фоновом режиме во время завершения сетевого ввода-вывода), и я ожидаю, что ваше диалоговое окно не обязательно будет соответствовать соответствующей теме. Поскольку кажется, что ваш "диалог" не связан с действием, это должно быть действие в форме действия на основе диалога. Это решает вашу проблему надежности и проблему вашей темы, хотя все еще существует вероятность того, что вы отображаете диалоговое окно (тематическую активность), пока пользователь находится в каком-либо другом приложении, если ваш сетевой ввод-вывод занимает больше времени, чем вы ожидаете.

Стратегически кажется, что вы заботитесь о результатах сетевого ввода-вывода независимо от того, что происходит на уровне пользовательского интерфейса вашего приложения. В этом случае ваш уровень пользовательского интерфейса вашего приложения не должен быть тем, который непосредственно получает результаты сетевого ввода-вывода, и кажется, что ваш фрагмент делает это прямо сейчас. Используйте что-то, что отделено от вашего интерфейса (IntentService, JobServiceголая нить, ThreadPoolExecutor) для управления сетевым вводом / выводом. Использовать шину событий (LocalBroadcastManager, EventBus greenrobot), чтобы сообщить уровню пользовательского интерфейса, что сетевой ввод / вывод завершен, и если уровень пользовательского интерфейса не отвечает на событие (потому что он находится в фоновом режиме, и вы обращаете внимание только на события, когда пользовательский интерфейс видим), поднимите Notification или сделайте что-нибудь еще, чтобы сообщить пользователю о результатах.

Вы должны использовать действие в качестве контекста для своего диалога, потому что диалог является компонентом, который ожидает контекст пользовательского интерфейса. Поэтому, прежде чем показывать диалог, вы можете проверить, добавлен ли текущий фрагмент к его активности с помощью метода isAdded():

if (isAdded()) {
    showDialog();
} 
Другие вопросы по тегам