0

私はConcurrentModificationExceptionHashMap を繰り返し処理しています。

どうすればこれを修正できますか?

public void stopAllPlaying(int fadeDurationInMs)
{
    for(PlayThread thread : threadMap.values()) {
        if(thread != null) {
            thread.fadeOut(fadeDurationInMs);
        }
    }
    threadMap.clear();
}

アップデート:

残念ながら、使用lockしても修正されていないようです。以下にエラーメッセージをコピーしました

09-06 01:05:51.366: E/AndroidRuntime(1307): FATAL EXCEPTION: main
09-06 01:05:51.366: E/AndroidRuntime(1307): java.util.ConcurrentModificationException
09-06 01:05:51.366: E/AndroidRuntime(1307):     at java.util.HashMap$HashIterator.nextEntry(HashMap.java:796)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at java.util.HashMap$ValueIterator.next(HashMap.java:828)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at com.example.myapp.AudioTrackPlayer.stopAllPlaying(AudioTrackPlayer.java:141)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at com.example.myapp.MyApp.stopAllSounds(MyApp.java:119)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at com.example.myapp.MainActivity.stopPlayback(MainActivity.java:114)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at com.example.myapp.MainActivity.onConfigurationChanged(MainActivity.java:451)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at android.app.ActivityThread.performConfigurationChanged(ActivityThread.java:3397)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at android.app.ActivityThread.handleConfigurationChanged(ActivityThread.java:3542)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1121)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at android.os.Looper.loop(Looper.java:150)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at android.app.ActivityThread.main(ActivityThread.java:4263)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at java.lang.reflect.Method.invokeNative(Native Method)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at java.lang.reflect.Method.invoke(Method.java:507)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09-06 01:05:51.366: E/AndroidRuntime(1307):     at dalvik.system.NativeStart.main(Native Method)

更新 2:

ハッシュマップが変更されているすべてのインスタンスにロックを追加する必要がありました!

4

2 に答える 2

1
private final Lock lock = new ReentrantLock();
public void stopAllPlaying(int fadeDurationInMs)
{
    lock.lock();
    try{
      for(PlayThread thread : threadMap.values()) {
          if(thread != null) {
              thread.fadeOut(fadeDurationInMs);
          }
      }
      threadMap.clear();
    }
    finally{
    lock.unlock();
    }
}

これでうまくいくはずです。

同じ Lock インスタンスを使用して、同じ方法で threadMap の他のすべての使用法をロックする必要があります。

注:同期を行う方法はこれだけではありません。

http://developer.android.com/reference/java/util/concurrent/locks/Lock.htmlも参照してください。

これも役立つかもしれません: http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

于 2013-09-06T06:00:36.887 に答える
0

これによりすべてのアプリケーションが停止するため、GUI スレッドを長時間ロックすることはできません。「fadeOut」は一瞬の音ではありません。

2 つのスレッドをカスケードします。GUI スレッドが中間スレッドを呼び出し、この中間スレッドが を呼び出しstopAllPlaying、必要に応じてロックを待ちます。中間スレッドは、任意の長い時間待機できます。

于 2013-09-06T06:57:32.217 に答える