我正在运行一个应用程序,该应用程序从 Fragment
中生成对话警报作为网络回调。这需要你传入一个可用的Context
引用;因为我使用的是 Fragment
,所以我使用 getActivity()
。由于回调的网络依赖性,getActivity()
可以 sometimes return null
.这会使我的代码崩溃。
要解决此错误,我希望改为向对话框提供 ApplicationContext
。 persists for the lifetime 是一个单例的应用程序,所以我知道它不会被撤回。此外,Dialog
的内容是关于支付确认的,所以我认为它在与某个Window
没有严格关系的情况下有合理的显示范围。
这是一个安全的实现方式吗?我是否在避免不可避免的情况,并且应该完全转向更稳健的模式?
最佳答案
Is this a safe implementation?
恕我直言,不。
从策略上讲,我希望您的应用程序在某些情况下崩溃(例如,您的应用程序在网络 I/O 完成时处于后台),并且我希望您的对话框不一定遵循适当的主题。由于您的“对话”似乎与 Activity 无关,因此它应该是一个 Activity ,以对话为主题的 Activity 形式。这解决了您的可靠性问题和主题问题,但如果您的网络 I/O 花费的时间比您预期的要长,您仍然有可能在用户使用其他应用程序时显示对话框(主题 Activity )。
从策略上讲,您似乎关心网络 I/O 的结果,而不管应用的 UI 层中发生了什么。在那种情况下,您的应用程序的 UI 层不应该是直接接收网络 I/O 结果的层,感觉您的 fragment 现在正在这样做。使用与 UI 分离的东西(IntentService
、JobService
、裸线程、ThreadPoolExecutor
)来管理网络 I/O。让它使用一个事件总线(LocalBroadcastManager
,greenrobot的EventBus)来告诉UI层网络I/O完成,如果UI层没有响应事件(因为在后台)并且您只关注 UI 可见时的事件),引发 Notification
或做一些其他微妙的事情让用户知道结果。
关于android - 将 ApplicationContext 用于对话框是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44328669/