【问题标题】:How to get an AsyncTask to cancel itself when the activity finishes如何在活动完成时让 AsyncTask 自行取消
【发布时间】:2011-03-18 19:11:04
【问题描述】:


我正在开发一个 ListActivity,它在列表的每个项目中都显示了一堆信息。
由于收集数据以显示在列表的每个条目中(来自 SD 卡的缩略图和来自数据库的计数)是时间密集型的,我考虑使用 AsyncTasks 来减轻主线程的负载并允许用户真正滚动列表快速而不滞后。

我考虑过在我的条目中使用视图的标签来取消滚动离开屏幕后重复使用的条目的 AsyncTasks。
类似:

public void bindView(View view, Context context, Cursor cursor) {
    [...]
    MyAsyncTask t (MyAsyncTask) myImageView.getTag();
    if (t != null) {
        t.cancel(true);
        t = null;
    }
    t = new MyAsyncTask();
    myImageView.setTag(t);
    t.execute();
    [...]
}

这部分应该可以工作,但我的问题是当活动完成或用户改变方向时。我宁愿避免保留我的 AsyncTasks 的数组或哈希映射,只是为了能够在 onPause 或 onStop 中取消它们。
从我在网上阅读的内容来看,AsyncTasks 将在方向改变或活动完成后继续在后台运行,更糟糕的是,它会使活动保持活动状态,防止它被垃圾收集(这绝对不是我想要的。)

关于我如何做到这一点的任何想法或建议?
我应该使用 AsyncTasks 以外的东西吗?

【问题讨论】:

  • 保留所有任务的列表可能会解决这个问题,你为什么不喜欢这种方法?
  • 似乎应该有更好的解决方案。
  • 我的想法(在我的问题中描述的实际上并没有达到预期的效果,因为当我打电话给cancel(true) 时任务不会停止,我最终得到一个java.util.concurrent.RejectedExecutionException on我在玩完列表后尝试execute()下一个任务的行,一旦AsyncTasks的线程池已满。我知道这个想法是定期从doInBackground(Object[])检查isCancelled()以完成任务尽早,但就我而言,这是不可能的,因为我只调用一个函数并且无法访问其源代码。:/

标签: android multithreading android-activity android-asynctask


【解决方案1】:

我会考虑用一个AsyncTask 替换AsyncTasks 的数组。 onProgressUpdate 可以在这里提供帮助。

【讨论】:

  • 您是否建议我一次只加载一个项目,而不是在它们出现时全部加载?我不确定我是否理解您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
相关资源
最近更新 更多