Android 在对话框中使用ApplicationContext安全吗?

Android 在对话框中使用ApplicationContext安全吗?,android,android-fragments,fragment,Android,Android Fragments,Fragment,我正在运行一个应用程序,它从片段中生成一个对话框警报,作为网络回调。这需要您传入一个可用的上下文引用;因为我使用的是Fragments,所以我使用getActivity()。由于回调的网络依赖性,getActivity()。这使我的代码崩溃 为了解决这个错误,我希望为对话框提供ApplicationContext。这是一个单一的应用程序,所以我知道它不会被撤回。此外,对话框的内容与付款确认有关,因此我认为它有合理的显示范围,与某个窗口没有严格的关系 这是一个安全的实现吗?我是否在避免不可避免的情

我正在运行一个应用程序,它从
片段中生成一个对话框警报,作为网络回调。这需要您传入一个可用的
上下文
引用;因为我使用的是
Fragment
s,所以我使用
getActivity()
。由于回调的网络依赖性,
getActivity()
。这使我的代码崩溃

为了解决这个错误,我希望为对话框提供
ApplicationContext
。这是一个单一的应用程序,所以我知道它不会被撤回。此外,
对话框
的内容与付款确认有关,因此我认为它有合理的显示范围,与某个
窗口
没有严格的关系

这是一个安全的实现吗?我是否在避免不可避免的情况,是否应该转向一种更稳健的模式

这是一个安全的实现吗

伊姆霍,不

从策略上讲,我希望您的应用程序在某些情况下崩溃(例如,在网络I/O完成时,您的应用程序在后台),并且我希望您的对话框不一定遵循适当的主题。因为你的“对话”似乎与活动无关,所以它应该是一个活动,以对话为主题的活动的形式。这解决了您的可靠性问题和主题问题,但如果您的网络I/O花费的时间比您预期的要长,那么当用户在其他应用程序中时,仍然有可能显示一个对话框(-themed activity)


从战略上讲,无论应用程序的UI层发生了什么,您似乎都关心网络I/O的结果。在这种情况下,应用程序的UI层不应该是直接接收网络I/O结果的层,而且感觉您的片段正在这样做。使用与UI分离的东西(
IntentService
JobService
,裸线程,
ThreadPoolExecutor
)来管理网络I/O。让它使用事件总线(
LocalBroadcastManager
,greenrobot的事件总线)告诉UI层网络I/O已完成,如果用户界面层没有响应事件(因为它在后台,而您只在用户界面可见时才关注事件),则发出
通知
,或者做一些其他微妙的事情让用户知道结果。

您必须使用活动作为对话框的上下文,因为对话框是一个组件,这需要UI上下文。因此,在显示对话框之前,您可以使用以下方法检查当前片段是否已添加到其活动中:


@到目前为止,PankajKumar在Galaxy S6和模拟API 24上工作。我将继续测试较低的API级别。这当然会起作用,但从长远来看,它会带来更奇怪的问题——如果你传递上下文,然后转到另一个屏幕,你就是内存泄漏。如果最小化AppMan,它也可能崩溃。不幸的是,这行不通。该对话框通知用户他们的付款已成功,并阻止他们尝试重新购买,即使已成功。我们每次都需要这个对话框!理想情况下,如果
上下文不可用,则当添加
时的某种回调将返回true,这将非常有助于启动消息。使用
EventBus
将关键事件数据返回到所属的
活动
是一个极好的建议。谢谢
if (isAdded()) {
    showDialog();
}