如何完全杀死片段或线程?

时间:2017-03-06 17:19:40

标签: java android multithreading android-fragments

我正在开发一个应用,其中我在一个Fragment中托管了两个Activity。活动布局有一个底栏,其中有按钮可以切换两个片段。 在这些片段中,Thread可以进行一些互联网工作,然后更新它们的布局。

Hieararchy:

  • Activity
    • Fragment 1
      • Thread 1
    • Fragment 2
      • Thread 2

问题

问题在于,当Thread 1开始做一些工作时,用户点击按钮切换到Fragment 2,Thread继续在后台运行,当完成它的网络任务并尝试更新视图(在现在不可见的Fragment 1中)时,应用程序崩溃,因为getActivity()getContext()现在返回{ {1}}。

编辑:该主题使用了nullgetActivity(),不仅用于更新布局,还用于保存getContext()等。 我可以向使用SharedPreferences的每一行添加一个检查(例如if(!stopped)),但我认为有一种更好的方法,而不是包含if条件中的每一步。

那么如何彻底杀死ContextThread?当片段被切换时,我不需要运行后台工作,我只需要在片段可见时运行它。

我已尝试使用Fragment并使用Thread.interrupt()删除片段(而非替换)。没用。

提前致谢:)

1 个答案:

答案 0 :(得分:0)

您可以在线程中检查getActivity()是否为空,在这种情况下不执行UI更新。一旦用户切换到另一个片段,更好的方法是停止下载 - 如何操作取决于您使用的HTTP客户端。使用HttpURLConnection,只需拨打disconnect()即可。

而不是使用Thread考虑使用支持被取消的AsyncTask。例如搜索SO,这里是一个:Ideal way to cancel an executing AsyncTask