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

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

祖奇
2023-03-14

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

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

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

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

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

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();
}

共有1个答案

孙帅
2023-03-14

尝试取消onpauseonstop方法中的异步任务。这将防止在片段不再活动时调用OnPostExecute(GetActivity()返回NULL)。

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

 类似资料:
  • 我一直对此感到沮丧,我找不到一个好的答案,所以希望这里有人能提供指导。 我有一个片段非常广泛地使用了。我经常被bug困扰,其中片段调用,返回null。我假设发生这些情况是因为在附加活动之前或分离活动之后调用了片段中的某些方法。 在我的代码中处理这个问题的正确方法是什么?我不想把这个成语到处乱扔, 查看

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

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

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

  • 我读过很多关于这方面的文章,但也有2012年或更早的文章。 (我只是打算从数据库中读取和插入一些数据。)

  • 我有一个大型Android游戏,其中每个逻辑屏幕都有一个活动。(启动画面、开始画面、关卡选择器、游戏画面和设置是不同的活动)。现在一切正常。 如果我重写所有内容,使得只有一个活动,逻辑屏幕是碎片,会减少RAM或CPU消耗吗?