Android - 跟踪线程

标签 android multithreading

我有一个 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/

相关文章:

java - 无法理解Threads-Runnable Interface的工作原理

Java多线程初学者问题

android - 使用google FCM for business App需要注册费吗?

Android:选项卡中嵌套 Activity 的选项菜单

android - 新 Activity 崩溃

javascript - 在android webview中使用angularjs时如何禁用网络安全?

linux -/proc/thread-self 的用途?

android - 如何在 ARCore sceneform 中将 View 渲染到父节点的右侧

multithreading - Apache Camel拆分与线程池并行运行,为什么?

c - ev_loop() 导致 valgrind 错误 - 地址位于堆栈 ptr 下方