java - PublishResult 中的 ConcurrentModificationException - ArrayAdapter

标签 java android

我继承的一些源代码有时会在这一行抛出 ConcurrentModificationException:

for (String c : filteredList) {

正文:

@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
    ArrayList<String> filteredList = (ArrayList<String>) results.values;
    if (results != null && results.count > 0) {
        clear();
        for (String c : filteredList) {
            add(c);
        }
        notifyDataSetChanged();
    }
}

我应该如何防止此错误发生?

最佳答案

并发修改异常:

It is not generally permissible for one thread to modify a Collection while another thread is iterating over it...

修补程序解决方案,将克隆 ArrayList<String> ,在迭代之前:

ArrayList<String> filteredList = (ArrayList<String>) results.values.clone();

您需要考虑,如果列表很大,您将在这段时间内消耗两倍的 RAM。

顺便说一句,我会先运行验证,然后映射/克隆你的列表,切换你的前两行,作为性能改进:

@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
    if (results != null && results.count > 0) {
        ArrayList<String> filteredList = (ArrayList<String>) results.values.clone();
        clear();
        for (String c : filteredList) {
            add(c);
        }
        notifyDataSetChanged();
    }
}

希望对您有所帮助!干杯,

关于java - PublishResult 中的 ConcurrentModificationException - ArrayAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41316886/

相关文章:

android - 单元测试和 joda-time-android

java - 如何使用 Content Provider 实现复杂的查询?

android - 我可以从哪里更改已在 App Store 中的应用程序的刷新率?

android - 开发支持英语和阿拉伯语的 Android 应用程序 "layout alignment"

java - Android Linkedin init 没有回调触发

java - 在 Eneter 中对单个服务器和多个客户端之间的通信进行加密,每个客户端使用不同的 key

java - 带有泛型的代码无法编译

javascript - UTF-8:从 Ajax 客户端到 Tomcat 服务器的希伯来字符集

java - Log4j,不同的附加程序,相同的包和一个单独的类,写入不同的文件?

java - 如何在 Java 调用 Oracle DB 中运行多个顺序语句?