找出一个片段何时被永久销毁

7

有没有方法可以找出一个片段是否被永久销毁,即它将来不会被重新创建?

我需要这个知道何时应该销毁与片段相关联的网络任务。


你找到解决方案了吗? - HaydenKai
4个回答

1
在片段的onDestroy()中调用getActivity().isChangingConfigurations()应该是有效的。

1
Activity类有一个“isFinishing()”方法,看起来这个方法更适合。 - sergey.n
我发现更改选项卡(viewpager...)会导致我的片段被销毁。在这种情况下,getActivity().isChangingConfigurations()为false,这意味着它不是活动销毁的正确标准... - chef
@chef 其实我不同意。当你切换标签时,并不一定会很快返回到那个标签,所以这就类似于将片段放入后退栈。活动被销毁,可能是永久性的,但不能保证这一点。清理这些大内存区域是明智的。然而,如果isChangingConfigurations返回true,片段将立即重新创建,所以你可能希望将一些东西保留在内存中。 - undefined

0
在你的片段中,重写onDestroy并取消你的AsyncTasks或其他操作。
AsyncTask task;

@Override
public void onDestroy() {
    if (task != null && !task.isCancelled()){
        task.cancel(true);
        task = null;
    }

    super.onDestroy();
}

1
我只想在确定该片段不会重新创建时取消任务。 - fhucho

0

如果任务与片段相关联,它应该在片段的onDestroy方法中被销毁。系统假定一旦该方法返回,所有片段的资源都已清理干净,因此您应该立即进行所需的清理操作。

如果将来重新创建片段,则它将成为全新的片段,因此很可能需要整个新的网络任务。

编辑: 如果您希望工作在活动由于配置更改(例如屏幕旋转)而被销毁和重新创建时继续在后台运行,则可以设置您的片段不被销毁。您需要做两件相对简单的事情:

  1. 定义您的片段没有 UI(这样当活动被销毁时就没有需要清理的东西)。
  2. 调用 setRetainInstance(true) 以防止片段随活动一起被销毁。当活动在配置更改后重新创建时,将重新附加保留的片段。同时它可以继续后台处理。

想象一种情况,用户提交评论后,UI 显示“正在发送评论…”消息,最后显示“评论已发送”消息。如果用户旋转屏幕,片段将被重新创建,这种情况将无法正常工作。(在建议之前,我决定不使用加载器。) - fhucho
在这种情况下,一个简单的解决方案是在执行敏感操作时防止屏幕旋转,以便您的片段不会被重新创建并打断您正在尝试实现的任何最终目标。 - Willis
如果只是一款低质量的应用程序,那么这样做可能还可以,但如果关心用户体验的话,这并不是最好的决定。 - fhucho
@fhucho - 对于这种情况,您应该使用保留的片段来防止由于配置更改而销毁并重新创建活动时被销毁(使用Fragment#setRetainInstance(boolean))。它应该是一个无界面的片段,这样它就不会与活动的元素绑定在一起。 - Ted Hopp
@TedHopp 我的片段有一个UI,如果我想使用保留的片段来保存后台任务,它必须是一个子片段 - 如果它不是子片段,它的生命周期可能与我的UI片段的生命周期不同。无论如何,这有点复杂,需要更多时间来解释所有细节,但还是谢谢你的帮助。 - fhucho
显示剩余3条评论

0
这将完全取决于您如何创建和设置片段。检查片段是否被永久销毁的简单方法是在片段的onDestroy()方法中添加一个toast或其他类型的通知/标志,以便您可以进行检查。如果您看到了toast或者标志已经设置,那么您就知道该片段已被销毁。

1
我不想检查片段是否被销毁,而是它是否会重新创建。当用户旋转屏幕时,片段将被销毁,然后使用旧片段实例的保存状态再次创建。 - fhucho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接