问题
java.lang.UnsupportedOperationException
at java.util.concurrent.CopyOnWriteArrayList$COWIterator.remove(CopyOnWriteArrayList.java:1111)
at holy.bible.test.MainActivity.onCreate(MainActivity.java:35)
at android.app.Activity.performCreate(Activity.java:7149)
at android.app.Activity.performCreate(Activity.java:7140)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1288)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3027)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3182)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1916)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6898)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
原因
根据堆栈信息可知,该错误是由于执行了CopyOnWriteArrayList子类COWIterator的remove方法产生的,代码如下:
List<String> list;
list = AnalysisDataManger.getInstance().getRuleList();
if(list==null||list.size() == 0){
list = new ArrayList<>();
list.addAll(getDefaultList());
}
final Iterator<String> each = list.iterator();
while (each.hasNext()) {
if (getWhiteList().contains(each.next())) {
each.remove();
}
}
在上面代码中,通过AnalysisDataManger.getInstance().getRuleList()获得的列表为了线程安全,其类型为CopyOnWriteArrayList,所以报错
解决方案
AnalysisDataManger.getInstance().getRuleList()中牵扯太多,不方便改动,这里就改动上面展示代码,将CopyOnWriteArrayList列表整体添加到ArrayList列表里
List<String> list = new ArrayList<>();
if(AnalysisDataManger.getInstance().getRuleList()!=null){
list.addAll(AnalysisDataManger.getInstance().getRuleList());
}
if (list.size() == 0) {
list.addAll(getDefaultList());
}
final Iterator<String> each = list.iterator();
while (each.hasNext()) {
if (getWhiteList().contains(each.next())) {
each.remove();
}
}
这里的改动方式值适用于当前逻辑,如果外部的列表也需要CopyOnWriteArrayList来保证线程安全,请另行处理
网友评论