【问题标题】:Android Activity ASyncTask and onCancelledAndroid Activity ASyncTask 和 onCancelled
【发布时间】:2014-08-19 05:52:44
【问题描述】:

我有一个活动,它将它开始的任何 AsyncTask 添加到向量列表中。

当 Activity 被销毁时,它会通过向量列表并在所有 AsyncTask 上调用 onCancelled。

因此在每个 AsyncTask 中调用 OnCancelled,将一些私有字段设置为 null。这些私有字段引用了活动拥有的一些对象。这与 AsyncTasks 检查“isCancelled”一起意味着 AsyncTasks 将以干净的方式停止。

每个 AsyncTask 还具有对向量列表的引用。

这留下了一些剩余的问题/问题:

  • 由于 AsyncTask 过去曾困扰过我:对于以下问题,API >= 8 的行为是否一致

  • 我假设只有在调用 cancel 时才调用 onCancelled。这意味着在这种情况下,让 Activity 维护向量列表并简单地将 AsyncTask 中对它的引用清空是否合理?

  • 在 AsyncTask 后代中,onCancelled 在哪个线程中运行? AsyncTask 一或 main-ui-activity 一调用“取消”? (这对于清空私有字段的线程安全很重要)

  • 每个 AsyncTask 是否应该在完成和销毁后找到并从列表中删除自己?假设析构函数在 AsyncTask 线程中运行,我是否只需要同步查找/删除操作?

【问题讨论】:

    标签: java android multithreading android-asynctask


    【解决方案1】:

    1)我所知道的 AsyncTask 中唯一的不一致是执行是真正并行的,而不是在单个线程上循环,而 executeOnExecutor 是真正的并行。

    2) 是的,onCancelled 只有在调用 cancel 时才会调用。但是请注意文档:在调用 cancel(boolean) 并且 doInBackground(Object[]) 完成后在 UI 线程上运行。

    这意味着不会在任何线程上立即调用 onCancelled。

    3)UI 线程,根据文档

    4)Java 没有析构函数。它有终结器,可能永远不会被调用,或者可能在 4 天后被调用。你不能依赖它们。

    【讨论】:

    • 谢谢!我已经接近可以“证明”不会发生线程问题的设计。我还没有,但会的。 (如果我有更多问题,将为此创建一个单独的 SO。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多