我有一个 Activity ,在执行期间,它会启动几个 AsyncTask
s 和几个 Thread
如果这些在 Activity 被销毁/重新创建时继续发生,那么就会发生各种错误,所以我的好主意是让每个非 UI 线程注册自己,将自己添加到 ArrayList<Thread>()
中。和 ArrayList<AsyncTask>()
这意味着我可以在 onDestroy() 中遍历这些 ArrayList 并像这样销毁它们:
@Override
public void onDestroy()
{
for(AsyncTask task : tasks)
task.cancel(true);*
for(Thread thread : threads)
thread.interrupt();
}
不幸的是,这会抛出一个 java.util.ConcurrentModificationException
在标有 * 的行上。我尝试包装每个 for
循环 synchronize
block 以确保 ArrayList
s 没有被任何其他人修改 Thread
做AsyncTask
s 在完成时销毁自己(因此抛出上述错误)?
有人知道在 Android 环境中控制线程的更好方法吗?
编辑
更改代码以使用 for(int i =0 : i < array.size() ; i++)
似乎解决了这个问题,但我仍然想知道/为什么/它会发生:
synchronized(tasks)
{
for(int i=0; i < tasks.size(); i++)
tasks.get(i).cancel(true);
}
synchronized(threads)
{
for(int i=0; i < threads.size(); i++)
threads.get(i).interrupt();
}
最佳答案
这是一个非常古老的话题,但无论如何我都会回答它,因为这是人们遇到的常见问题。
这里发生的是下面的代码,
for(AsyncTask task : tasks)
task.cancel(true);`
使用 for-each 循环,它需要 tasks
对象在遍历它时保持完整。我的猜测是,在任务的 onPostExecute()
中,您将其从列表中删除,这会修改它并导致异常。
关于Android - 跟踪线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7013617/