5252import java .util .HashMap ;
5353import java .util .List ;
5454import java .util .Map ;
55+ import java .util .concurrent .CopyOnWriteArrayList ;
5556
5657public class TextServicesManagerService extends ITextServicesManager .Stub {
5758 private static final String TAG = TextServicesManagerService .class .getSimpleName ();
@@ -582,8 +583,8 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
582583 private class SpellCheckerBindGroup {
583584 private final String TAG = SpellCheckerBindGroup .class .getSimpleName ();
584585 private final InternalServiceConnection mInternalConnection ;
585- private final ArrayList <InternalDeathRecipient > mListeners =
586- new ArrayList <InternalDeathRecipient >();
586+ private final CopyOnWriteArrayList <InternalDeathRecipient > mListeners =
587+ new CopyOnWriteArrayList <InternalDeathRecipient >();
587588 public boolean mBound ;
588589 public ISpellCheckerService mSpellChecker ;
589590 public boolean mConnected ;
@@ -601,19 +602,24 @@ public void onServiceConnected(ISpellCheckerService spellChecker) {
601602 if (DBG ) {
602603 Slog .d (TAG , "onServiceConnected" );
603604 }
604- synchronized (mSpellCheckerMap ) {
605- for (InternalDeathRecipient listener : mListeners ) {
606- try {
607- final ISpellCheckerSession session = spellChecker .getISpellCheckerSession (
608- listener .mScLocale , listener .mScListener , listener .mBundle );
609- listener .mTsListener .onServiceConnected (session );
610- } catch (RemoteException e ) {
611- Slog .e (TAG , "Exception in getting the spell checker session."
612- + "Reconnect to the spellchecker. " , e );
613- removeAll ();
614- return ;
605+
606+ for (InternalDeathRecipient listener : mListeners ) {
607+ try {
608+ final ISpellCheckerSession session = spellChecker .getISpellCheckerSession (
609+ listener .mScLocale , listener .mScListener , listener .mBundle );
610+ synchronized (mSpellCheckerMap ) {
611+ if (mListeners .contains (listener )) {
612+ listener .mTsListener .onServiceConnected (session );
613+ }
615614 }
615+ } catch (RemoteException e ) {
616+ Slog .e (TAG , "Exception in getting the spell checker session."
617+ + "Reconnect to the spellchecker. " , e );
618+ removeAll ();
619+ return ;
616620 }
621+ }
622+ synchronized (mSpellCheckerMap ) {
617623 mSpellChecker = spellChecker ;
618624 mConnected = true ;
619625 }
0 commit comments