当前位置: 首页 > 知识库问答 >
问题:

碎片,我什么时候“活跃”?

陶英达
2023-03-14

我一直对此感到沮丧,我找不到一个好的答案,所以希望这里有人能提供指导。

我有一个片段非常广泛地使用了AsyncTask。我经常被bug困扰,其中片段调用getActivity(),返回null。我假设发生这些情况是因为在附加活动之前或分离活动之后调用了片段中的某些方法。

在我的代码中处理这个问题的正确方法是什么?我不想把这个成语到处乱扔,

Activity activity = getActivity();
if (activity != null) { // do something }

查看片段的文档,我可以想出许多可能的钩子来解决这个问题:isDetached()onActivityCreated()onAttach()isResumed(),等等。正确的组合是什么?

编辑:

一些人建议暂停时取消任务,但这意味着标准的习语,

new AsyncTask<...>.execute();

不能使用。这意味着每个执行的AsyncTask都需要跟踪到完成,或者取消。我从来没有在谷歌或其他地方的示例代码中看到过这一点。大概,

private final Set<AsyncTask<?>> tasks = new HashSet<>;
...
AsyncTask<?> t = new AsyncTask<...>() {
  ...
  public void onPostExecute(...) {
    tasks.remove(this);
    ...
  } 
}
tasks.add(t);
t.execute();
...
@Override
public void onPause() {
  for (AsyncTask<?> t: tasks) {
    t.cancel();
  }
  tasks.clear();
}

共有3个答案

公孙新觉
2023-03-14

在协调生命周期方面,我将onActivityCreated作为一个心理基准-它标记了基础活动在创建时完成自己的onCreate的点。在此之前,我不相信有任何活动可以getActivity()from。

get活动返回null听起来像是调用getActivity()太早(即在创建之前)或太晚(即当它停止与片段交互时)。在onPause()中停止任务将防止getActivity返回null,因为一旦片段停止与基础活动交互,它将切断任务,因为活动本身已暂停。我认为等待onStop()可能太晚了,因为如果在基础活动暂停时任务仍在运行,那么它可能仍然为空。

徐嘉谊
2023-03-14

我找不到一个好的解决办法。总之,使用加载程序,或者在使用它之前检查getActivity()是否未返回null。我研究了如何使用Loaders,但是这个模式对应用程序的结构和数据检索的性质做了很多假设,但这些假设对我来说并不适用。

慕宏博
2023-03-14

尝试在onPauseonStop方法中取消异步任务。这将防止在片段不再处于活动状态时调用onPostExecutegetActivity()返回null)。

或者,您可以通过调用this来检查片段是否已附加。isAdded()片段中。

 类似资料:
  • 我一直对此感到沮丧,也找不到好的答案,所以希望这里有人能提供指导。 我有一个片段相当广泛地使用了。片段调用(返回null)时,我经常受到错误的困扰。我假设发生这些情况是因为在附加活动之前或分离活动之后调用了片段中的某些方法。 在我的代码中处理这个问题的正确方法是什么?我不想让这个成语到处乱扔, 一些人建议在暂停时取消任务,但这意味着标准习惯用语, 无法使用。这意味着每个执行的都需要跟踪到完成或取消

  • 我可以使用一个片段作为一个活动吗?我已经创建了一个片段,但我希望它有像活动一样的功能,所以我使用片段扩展碎片活动。然而,我有一个带有碎片的导航抽屉。当我更改为“扩展碎片活动”时,我的代码有问题?请给我指路。

  • 由于不推荐使用TabActivity,我需要找到一种方法来使用片段。在我知道它如何工作之前,我已经使用了碎片,但我需要一个指南来创建我的标签主机与碎片活动。我在互联网上找到了几个例子,它们都是关于将片段放入标签的容器中的。

  • 我已经为Android开发了几年了,我仍然发现自己在这个问题上反复思考:什么时候我应该使用backstack中的片段,还是将每个片段放入自己的活动中? 在Android片段文档中,他们展示了如下图: 我完全理解tablet用例,但对于手机用例,我不明白为什么要将每个片段放入自己的活动中。我通常创建一个活动并将片段添加到backstack(通过FragmentManager)。这两种方法中的任何一种

  • 问题内容: 我使用类只有很短的时间,编写方法时,我使所有变量都引用了self,例如self.foo。 但是,我在浏览《 wxPython in Action》 一书时发现,“ self”并没有一直使用。例如: 下面的一个确实使用“自我”。 如果我没记错的话,“自我”是指该类的特定实例,那么什么时候没有必要?有一般的经验法则吗? 问题答案: 您用于引用当前实例的属性。 您用于引用父类的方法。 如果仅

  • 谷歌正在通过电子邮件通知Android位置权限的更改: 我们将于2016年10月15日进行更改,这将影响针对API版本21(Android 5.0、Lollipop)或更高版本的应用程序,这些应用程序使用ACCESS_FINE_LOCATION但没有明确具有“android.hardware.location.gps”用途功能。展望未来,这些应用程序将可安装在没有GPS硬件的设备上。在大多数情况下