diff --git a/services/java/com/android/server/TextServicesManagerService.java b/services/java/com/android/server/TextServicesManagerService.java index d04b4404ae40a..8384ebc23d7d0 100644 --- a/services/java/com/android/server/TextServicesManagerService.java +++ b/services/java/com/android/server/TextServicesManagerService.java @@ -392,9 +392,16 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { Slog.d(TAG, "FinishSpellCheckerService"); } synchronized(mSpellCheckerMap) { + final ArrayList removeList = + new ArrayList(); for (SpellCheckerBindGroup group : mSpellCheckerBindGroups.values()) { if (group == null) continue; - group.removeListener(listener); + // Use removeList to avoid modifying mSpellCheckerBindGroups in this loop. + removeList.add(group); + } + final int removeSize = removeList.size(); + for (int i = 0; i < removeSize; ++i) { + removeList.get(i).removeListener(listener); } } } @@ -669,6 +676,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { } } + // cleanLocked may remove elements from mSpellCheckerBindGroups private void cleanLocked() { if (DBG) { Slog.d(TAG, "cleanLocked");