【问题标题】:Android. AsyncTasks安卓。异步任务
【发布时间】:2013-03-09 09:30:13
【问题描述】:

我正在使用广告网络在我的应用中展示一些广告。他们库中的 loadAd 函数有时会导致模拟器死机(可能是因为某些防火墙问题)。

无论如何,我已经开始使用 AsyncTasks,在其中我实际调用了 loadAd 方法(因此 UI 不再冻结),它从他们的服务器请求横幅或任何内容。

每当我重新启动我的Activity 时,都会调用ActivityonDetroy 方法。在那里,我调用了AscynTask's cancel 方法,这样它将取消任务并......大概停止/删除线程。

查看 DDMS,我注意到以下几点:

查看快照:http://bayimg.com/EAkBaAaEH

每次我调用AsyncTaskexecute 方法时,都会创建两个AsynkTasks(#1 和#2),当我调用cancel(true) 方法时它们似乎不会消失(被杀死) `onDestroy().

Activity 重新启动后,会创建另外两个 AsyncTasks 线程(#3 和 #4)。

Activity 再次重新启动后,又创建了一个AsynkTask (#5)。

我怎样才能真正杀死任务?就像完全停止他们的执行一样?还是他们真的停止了,而我只是误解了 DDMS?

【问题讨论】:

  • 当取消被调用时,asyntask doinBackground 将继续它的工作并且当它完成时,而不是 onPostExecute .. OnCancelListener 将被调用
  • 好吧,在广告加载和一切之后(在完成doInBackground 中列出的事情之后),它仍然出现在DDMS 中。这是为什么?为什么它不会从 DDMS 中消失?

标签: android ddms


【解决方案1】:

确保您没有在 Asynctask doinBackground 中执行 while(true)(long continous task) 之类的事情,asynctask 不应用于后台线程中的长/连续进程,如果它是一个小的后台任务,它将完成并且如果在 doinbackground 执行期间调用了取消,则将调用 onPostExecute 而不是 oncancellistener...

至于仍然留在 DDMS 中,请检查: AsyncTask thread still there after execute, is that normal?

它只是空闲线程没什么可怕的,因为异步任务在线程池中运行。空闲线程等待下一个异步任务被执行

【讨论】:

  • 一件更快捷的事情......当调用AsyncTaskonCancelled 方法时,是否会强制停止执行doInBackground 方法中的任何内容?如果那里有while(1),当我打电话给cancel(true) 时,它会“杀死”一切吗,不管它是什么?是否保证线程将停止?还是我必须在onCancelled 方法中做一些事情来强制代码停止(取决于doInBackground 中的代码。也许设置一个标志或其他东西。)?
  • Asyntask 中有一个方法 isCancelled() 检查其在 While(true) 循环中的布尔值是否为真... ... developer.android.com/reference/android/os/…
  • 是的,我 1 分钟前还在看那个。 :) 出色的。非常感谢您的宝贵时间。
  • 还要注意 asynctask 是基于线程池的,所以如果你的线程池限制达到我认为是 5(不完全确定)新的 asynctask 将进入等待状态,并且只会在前一个线程完成时执行。 .. 只是提醒一下,我有一个 asynctask,while(true) 在服务中,并且很少有活动,突然间新的 asynctask 停止执行 doinbackgrounds。这让我很困惑:)所以让你知道
猜你喜欢
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
相关资源
最近更新 更多