我继承的一些源代码有时会在这一行抛出 ConcurrentModificationException:
for (String c : filteredList) {
body:
@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();
}
}
我应该如何防止这个错误的发生?
并发修改异常:
通常不允许一个线程修改 Collection,而另一个线程正在迭代它......
修补程序解决方案将克隆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();
}
}
希望能帮助到你!干杯,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)