我正在运行一个应用程序,它会在Fragment
内生成一个对话警报作为网络回调。这要求您传入可用的Context
引用;因为我正在使用Fragment
,所以我使用getActivity()
。由于回调的网络相关性质,getActivity()
可以sometimes return null
。这会导致我的代码崩溃。
要解决此错误,我希望将#{1}}提供给对话框。它是应用程序persists for the lifetime的单例,所以我知道它不会被撤销。此外,ApplicationContext
的内容与付款确认有关,因此我认为在没有与某个Dialog
严格关系的情况下展示它是合理的。
这是一个安全的实施吗?我是否避免不可避免的事情,并且应该完全转向更强大的模式?
答案 0 :(得分:2)
这是一个安全的实施吗?
恕我直言,没有。
从战术上讲,我希望您的应用在某些情况下崩溃(例如,您的应用在网络I / O完成时处于后台),我希望您的对话框不一定符合相应的主题。因为它似乎是你的'#34;对话框"与活动无关,它应该是活动,以对话为主题的活动形式。这解决了您的可靠性问题和您的主题问题,但如果您的网络I / O需要的时间超过预期,则仍有可能在用户使用其他应用程序时显示对话框(主题活动)。
从战略上讲,无论您的应用的UI层发生了什么,您似乎都关心网络I / O的结果。在这种情况下,您的应用程序的UI层不应该是直接接收网络I / O结果的那个,并且感觉就像您的片段正在执行此操作。使用与UI(IntentService
,JobService
,裸线程ThreadPoolExecutor
)分离的内容来管理网络I / O.让它使用事件总线(LocalBroadcastManager
,greenrobot的EventBus)告诉UI层网络I / O已完成,以及UI层是否响应事件(因为它在背景,你只关注UI可见时的事件),提出Notification
或做一些微妙的事情让用户知道结果。
答案 1 :(得分:1)
您必须为Dialog使用Activity作为Context,因为Dialog是一个需要UI上下文的组件。因此,在显示对话框之前,您可以使用isAdded()方法检查当前片段当前是否已添加到其活动中:
if (isAdded()) {
showDialog();
}