当活动被破坏但我必须继续执行片段中的代码时该怎么办?

Posted

技术标签:

【中文标题】当活动被破坏但我必须继续执行片段中的代码时该怎么办?【英文标题】:What to do when activity is destroyed but I must continue executing code in fragment? 【发布时间】:2017-10-29 15:21:18 【问题描述】:

我有一个很奇怪的问题。在一个片段中,我执行一个过程,当该过程完成时,我会显示一个广告,该广告会在用户单击/关闭广告时回调该片段。问题在于,在某些设备中,当广告回调处理程序(即在运行的片段中)时,包含该片段的活动已被破坏,但我需要通过可运行文件做更多的工作。因此,在这种情况下,runnable 在执行时会抛出 NullPointerException int is run 方法。

我可以检查活动是否仍然存在,并在它存在时只运行可运行对象,但在它不存在的情况下,我仍然需要继续完成广告之后需要完成的部分工作.

你如何处理这种情况?几个小时以来,我一直在思考这个问题,但没有找到解决方案。

提前致谢。

【问题讨论】:

【参考方案1】:

在这种情况下你可以使用 AsyncTask 。

AsyncTask 进程不会被操作系统自动终止。 AsyncTask 进程在后台运行,并且在任何情况下都负责完成它自己的工作。您可以通过调用 cancel(true) 方法取消您的 AsycnTask。这将导致对 isCancelled() 的后续调用返回 true。调用此方法后,在 doInBackground() 返回后调用 onCancelled(Object) 方法而不是 onPostExecute() 方法。

希望对你有帮助..

【讨论】:

我已将 AsyncTasks 用于其他职责。但你真的认为这会有所帮助吗?你的意思是在执行 AsyncTask 时 Activity 不会被杀死? 另一方面,似乎导致问题的原因是我的应用程序对广告的上下文更改。所以在我的情况下,我应该在流程的第一部分使用 AsynTask 一个 -> 显示广告 -> 广告响应处理程序 -> 在流程的第二部分使用 AsyncTask。这不会导致同样的问题吗?我将无法启动第二个 AsyncTask(作业继续),因为活动可能已死。 AsyncTask 总是完成它的执行..即使 Activity 已经被销毁了。但是一旦 Activity 被销毁 Context 就会变为 null ,所以不要忘记对你的 context 进行空检查...跨度> 【参考方案2】:

嗯,这个问题的方式我不确定你在问什么,也许一些文本连接器可能会起作用,我不确定这是一个关于状态变化的非常基本的问题还是一个非常复杂的问题。

据我了解:

这不会和你翻转屏幕时的问题一样吗?制作一个捆绑通过活动更改恢复的数据。这样,如果您的活动已被销毁,您可以恢复它

片段有一个特性,你可以使用它来让实例在配置更改时保持活动状态:retainInstance setRetainInstance(true) // 默认为 false

Parcelable 与 Serializable 类似,是一种用于将对象保存到字节流中的 API。对象可以选择实现 Parcelable 接口,如果它们是我们在这里称为“可存储”的对象。对象在 Java 中通过将它们放在一个 Bundle 中,或者通过将它们标记为 Serializable 以便它们可以序列化,或者通过实现 Parcelable 接口来隐藏在 Java 中。无论您采用哪种方式,都适用相同的想法:除非您的对象是可存储的,否则您不应该使用这些工具中的任何一个 ---或者---

把你的“广告”变成一个警报,它不会干扰活动。

---或者---

在不同的线程上运行响应?

【讨论】:

你的意思是“把你的那个“广告”变成一个警报,它不会弄乱活动。”什么是警报? 澄清一下,我无法控制该广告,它是 Facebook 受众广告,所以我不确定是否可以将其转换为“警报”。

以上是关于当活动被破坏但我必须继续执行片段中的代码时该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

被替换的片段不会被破坏

当Activity被销毁时,为什么Service会破坏自我?

如何缓存片段视图

活动在片段上出现的权限对话框中被破坏

使用导航抽屉旋转时的片段更改

收藏|分享前端开发常用代码片段