Ответ 1
Это безопасная реализация?
ИМХО, нет.
Тактически, я ожидаю, что ваше приложение будет аварийно завершено в некоторых ситуациях (например, ваше приложение находится в фоновом режиме на момент завершения ввода-вывода в сети), и я ожидаю, что ваш диалог не обязательно будет соответствовать соответствующей теме. Поскольку, похоже, ваш "диалог" не привязан к активности, он должен быть активным в форме диалогового действия. Это решает проблему надежности и проблемы с вашей темой, хотя по-прежнему существует вероятность того, что вы отобразите диалоговое окно (-themed activity), когда пользователь находится в другом приложении, если ваш сетевой ввод-вывод занимает больше времени, чем вы ожидаете.
Стратегически, похоже, что вы заботитесь о результатах своих сетевых операций ввода-вывода независимо от того, что происходит на уровне пользовательского интерфейса вашего приложения. В этом случае ваш слой пользовательского интерфейса вашего приложения не должен быть непосредственно получающим результаты сетевого ввода-вывода, и кажется, что ваш фрагмент делает это прямо сейчас. Для управления сетевым вводом-выводом используйте что-то, что отключено от вашего пользовательского интерфейса (IntentService
, JobService
, голый поток, ThreadPoolExecutor
). Используйте ли он шину событий (LocalBroadcastManager
, greenrobot EventBus), чтобы сообщить уровню пользовательского интерфейса, что сетевой ввод-вывод завершен, и если слой пользовательского интерфейса не отвечает на событие (потому что он находится в фоновом режиме и вы только обратите внимание к событиям, когда пользовательский интерфейс виден), поднимите Notification
или сделайте что-то еще тонкое, чтобы пользователь знал о результатах.