在android中为每个人抛出ConcurrentModificationException

时间:2017-09-28 07:06:27

标签: java android android-studio

我在forloop中传递标签列表以进行迭代,但是它引发了ConcurrentModificationException

private List<string> urls = //fetch from db;
ManualResetEvent waitEvent = new ManualResetEvent(false);
BrowserView webView = new WPFBrowserView();
string path = //my local path;

public MainWindow()
{
    InitializeComponent();

    mainLayout.Children.Add((UIElement)webView.GetComponent());


    webView.Browser.FinishLoadingFrameEvent += delegate (object sender, FinishLoadingEventArgs e)
    {
        System.Threading.Thread.Sleep(5000);

        if (e.IsMainFrame)
        {
            DOMDocument document = e.Browser.GetDocument();
            var html = document.DocumentElement.InnerHTML;

            System.IO.File.WriteAllText(path, html);
            waitEvent.Set();
        }
    };

    foreach (var url in urls)
    {
            webView.Browser.LoadURL(url);
            waitEvent.WaitOne();
            waitEvent.Reset();
    }
}

3 个答案:

答案 0 :(得分:1)

这是因为在迭代数组时不允许删除和添加操作。因此,您需要存储要在不同数组中删除的所有元素,然后立即删除它们。这是一个例子:

public void clearTag() {
    List<Tag> tags = binding.search.tagView.getTags();
    List<Tag> tagsToRemove = new ArrayList<>();
    Log.d(TAG, "clearTags: " + tags);
    for (Tag tag : tags) {
        Log.d(TAG, "clearTag: " + tag + " " + tag.getLayoutColor());
        if (tag.getLayoutColor() == R.color.red) {
           tagsToRemove.add(tag);
        } else if (tag.getLayoutColor() == R.color.blue) {
            tagsToRemove.add(tag);
        } else if (tag.getLayoutColor() == R.color.green) {
            tagsToRemove.add(tag);
        }
    }
    tags.removeAll(tagsToRemove);
    updateTagVisibility();
    //resetFilter();
}

答案 1 :(得分:0)

如果您将每个循环更改为“正常”&#39;对于循环,与(int = 0; i&lt; size; i ++)一样,它可能有效。确保每次删除元素时都必须将一个元素移回i - ;

答案 2 :(得分:0)

我最近遇到过这个例外。当您尝试修改已在使用/迭代的集合时,会发生这种情况。

您的每个循环从Tag列表中选择一个tags对象,并在循环内从同一列表中删除该对象。这在Java中是不允许的。

您可以像这样更改代码:

public void clearTag(){
    List<Tag> tags = binding.search.tagView.getTags();
    // Create a dummy arrayList to store the tags to remove
    List<Tag> removedTags = new ArrayList<Tag>();
    Log.d(TAG, "clearTags: " + tags);
    for (Tag tag : tags) {
        Log.d(TAG, "clearTag: " + tag + " " + tag.getLayoutColor());
        if (tag.getLayoutColor() == R.color.red) {
           removedTags.add(tag);
        } else if (tag.getLayoutColor() == R.color.blue) {
            removedTags.add(tag);
        } else if (tag.getLayoutColor() == R.color.green) {
            removedTags.add(tag);
        }
    }

    // remove the tags
    tags.removeAll(removedTags)
    updateTagVisibility();
    //resetFilter();
}

Reference