gpt4 book ai didi

java - 避免并发修改异常

转载 作者:行者123 更新时间:2023-12-02 04:50:05 27 4
gpt4 key购买 nike

我尝试调试一些代码并给出并发修改异常

代码

final GestureLibrary store1 = GestureLibraries.fromFile(new File(Environment.getExternalStorageDirectory(), "Gesture_launcher"));

if (store1.load())
{
for (String name : store1.getGestureEntries())
{
for (Gesture gesture : store1.getGestures(name))
{
if(name.contains(gesture_name))
{
store1.removeGesture(name, gesture);
store1.addGesture(name, mGesture);
store1.save();

Toast.makeText(getApplicationContext(), getResources().getString(R.string.saved), Toast.LENGTH_LONG).show();
}
}
}
}

执行上面的语句会出现concurrentModificationException

日志猫

03-28 02:47:45.422: E/AndroidRuntime(449): FATAL EXCEPTION: main
03-28 02:47:45.422: E/AndroidRuntime(449): java.util.ConcurrentModificationException
03-28 02:47:45.422: E/AndroidRuntime(449): at java.util.HashMap$HashIterator.nextEntry(HashMap.java:796)
03-28 02:47:45.422: E/AndroidRuntime(449): at java.util.HashMap$KeyIterator.next(HashMap.java:823)
03-28 02:47:45.422: E/AndroidRuntime(449): at com.likith.gesturebuilder.change_gestures.setGestures(change_gestures.java:69)
03-28 02:47:45.422: E/AndroidRuntime(449): at com.likith.gesturebuilder.change_gestures$1.onClick(change_gestures.java:110)
03-28 02:47:45.422: E/AndroidRuntime(449): at android.view.View.performClick(View.java:2485)
03-28 02:47:45.422: E/AndroidRuntime(449): at android.view.View$PerformClick.run(View.java:9080)
03-28 02:47:45.422: E/AndroidRuntime(449): at android.os.Handler.handleCallback(Handler.java:587)
03-28 02:47:45.422: E/AndroidRuntime(449): at android.os.Handler.dispatchMessage(Handler.java:92)
03-28 02:47:45.422: E/AndroidRuntime(449): at android.os.Looper.loop(Looper.java:123)
03-28 02:47:45.422: E/AndroidRuntime(449): at android.app.ActivityThread.main(ActivityThread.java:3683)
03-28 02:47:45.422: E/AndroidRuntime(449): at java.lang.reflect.Method.invokeNative(Native Method)
03-28 02:47:45.422: E/AndroidRuntime(449): at java.lang.reflect.Method.invoke(Method.java:507)
03-28 02:47:45.422: E/AndroidRuntime(449): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-28 02:47:45.422: E/AndroidRuntime(449): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-28 02:47:45.422: E/AndroidRuntime(449): at dalvik.system.NativeStart.main(Native Method)

请告诉任何方法如何避免此异常谢谢

编辑1:现在我已经修改了代码

List<Gesture> list = store1.getGestures(gesture_name);
Set<String> List_name = store1.getGestureEntries();

for (String name : List_name)
{
for (Gesture gesture : list)
{
if(name.contains(gesture_name))
{
store1.removeGesture(name, gesture);
store1.addGesture(name, mGesture);
store1.save();

Toast.makeText(getApplicationContext(), getResources().getString(R.string.saved), Toast.LENGTH_LONG).show();
}
}
}

它再次给了我同样的错误。

最佳答案

您在调用 store1.removeGesture() 和 store1.addGesture() 的同时循环访问 store1.getGestures()。

尝试复制手势数组并循环复制副本。

Array<Gesture> newArray = new Array<>();
newArray.addAll(store1.getGestures(name));
for (Gesture gesture : newArray)
{
if(name.contains(gesture_name))
{
store1.removeGesture(name, gesture);
store1.addGesture(name, mGesture);
store1.save();
...

关于java - 避免并发修改异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29313144/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com