首页 > 解决方案 > 反应原生 - 无法暂停活动(java.util.ConcurrentModificationException)

问题描述

我正在使用react-native-audio-toolkit来录制和播放声音。

录音工作正常。播放器也可以正常工作。但是,当我在初始化和使用 Player 的视图上,并且当我暂停应用程序(通过转到后台)时,应用程序崩溃并且我的 Android 调试器中显示以下错误:

 05-24 21:06:35.584 10759-10759/com.myapp E/MediaPlayerNative: pause called in state 8, mPlayer(0xcdfc5c60)
 05-24 21:06:35.584 10759-10759/com.myapp E/MediaPlayerNative: error (-38, 0)
 05-24 21:06:35.585 10759-16605/com.myapp E/MediaPlayer: Error (-38,0)
 05-24 21:06:35.585 10759-10759/com.myapp E/MediaPlayerNative: Attempt to call getDuration in wrong state: mPlayer=0xcdfc5c60, mCurrentState=0
 05-24 21:06:35.585 10759-10759/com.myapp E/MediaPlayerNative: error (-38, 0)
 05-24 21:06:35.586 10759-10759/com.myapp E/MediaPlayerNative: pause called in state 8, mPlayer(0xcdfc5ec0)
 05-24 21:06:35.586 10759-10759/com.myapp E/MediaPlayerNative: error (-38, 0)
 05-24 21:06:35.586 10759-10759/com.myapp E/MediaPlayerNative: Attempt to call getDuration in wrong state: mPlayer=0xcdfc5ec0, mCurrentState=0
 05-24 21:06:35.586 10759-10759/com.myapp E/MediaPlayerNative: error (-38, 0)
 05-24 21:06:35.587 10759-16605/com.myapp V/MediaPlayer: resetDrmState:  mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
 05-24 21:06:35.587 10759-16605/com.myapp V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
 05-24 21:06:35.592 10759-10759/com.myapp E/MediaPlayerNative: pause called in state 8, mPlayer(0xcc47f640)
 05-24 21:06:35.592 10759-10759/com.myapp E/MediaPlayerNative: error (-38, 0)
 05-24 21:06:35.592 10759-10759/com.myapp E/MediaPlayerNative: Attempt to call getDuration in wrong state: mPlayer=0xcc47f640, mCurrentState=0
 05-24 21:06:35.592 10759-10759/com.myapp E/MediaPlayerNative: error (-38, 0)
 05-24 21:06:35.593 10759-10759/com.myapp E/MediaPlayerNative: pause called in state 8, mPlayer(0xcc47f6a0)
 05-24 21:06:35.593 10759-10759/com.myapp E/MediaPlayerNative: error (-38, 0)
 05-24 21:06:35.599 10759-10759/com.myapp E/AndroidRuntime: FATAL EXCEPTION: main
 Process: com.myapp, PID: 10759
 java.lang.RuntimeException: Unable to pause activity {com.myapp/com.myapp.MainActivity}: java.util.ConcurrentModificationException
 at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:4058)
 at android.app.ActivityThread.performPauseActivity(ActivityThread.java:4024)
 at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3997)
 at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3971)
 at android.app.ActivityThread.-wrap15(Unknown Source:0)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1700)
 at android.os.Handler.dispatchMessage(Handler.java:106)
 at android.os.Looper.loop(Looper.java:164)
 at android.app.ActivityThread.main(ActivityThread.java:6753)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:482)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
 Caused by: java.util.ConcurrentModificationException
 at java.util.HashMap$HashIterator.nextNode(HashMap.java:1441)
 at java.util.HashMap$EntryIterator.next(HashMap.java:1475)
 at java.util.HashMap$EntryIterator.next(HashMap.java:1475)
 at com.futurice.rctaudiotoolkit.AudioPlayerModule.onHostPause(AudioPlayerModule.java:64)
 at com.facebook.react.bridge.ReactContext.onHostPause(ReactContext.java:214)
 at com.facebook.react.ReactInstanceManager.moveToBeforeResumeLifecycleState(ReactInstanceManager.java:676)
 at com.facebook.react.ReactInstanceManager.onHostPause(ReactInstanceManager.java:510)
 at com.facebook.react.ReactInstanceManager.onHostPause(ReactInstanceManager.java:529)
 at com.facebook.react.ReactActivityDelegate.onPause(ReactActivityDelegate.java:96)
 at com.facebook.react.ReactActivity.onPause(ReactActivity.java:60)
 at android.app.Activity.performPause(Activity.java:7170)
 at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1552)
 at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:4047)
 at android.app.ActivityThread.performPauseActivity(ActivityThread.java:4024) 
 at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3997) 
 at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3971) 
 at android.app.ActivityThread.-wrap15(Unknown Source:0) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1700) 
 at android.os.Handler.dispatchMessage(Handler.java:106) 
 at android.os.Looper.loop(Looper.java:164) 
 at android.app.ActivityThread.main(ActivityThread.java:6753) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:482) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
 05-24 21:06:35.604 10759-16605/com.myapp W/MediaPlayer: mediaplayer went away with unhandled events
 05-24 21:06:35.604 10759-16605/com.myapp E/MediaPlayer: Error (-38,0)
 05-24 21:06:35.607 10759-16605/com.myapp V/MediaPlayer: resetDrmState:  mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
 05-24 21:06:35.608 10759-16605/com.myapp V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
 05-24 21:06:35.614 10759-16605/com.myapp W/MediaPlayer: mediaplayer went away with unhandled events
 05-24 21:06:35.614 10759-16605/com.myapp E/MediaPlayer: Error (-38,0)
 05-24 21:06:35.616 10759-16605/com.myapp V/MediaPlayer: resetDrmState:  mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
 05-24 21:06:35.616 10759-16605/com.myapp V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
 05-24 21:06:35.620 10759-16605/com.myapp W/MediaPlayer: mediaplayer went away with unhandled events
 05-24 21:06:35.641 10759-18225/com.myapp D/OSTracker: OS Event: crash

AudioPlayerModule.java是导致此错误的函数(根据错误):

@Override
public void onHostPause() {
    for (Map.Entry<Integer, MediaPlayer> entry : this.playerPool.entrySet()) {
        Integer playerId = entry.getKey();

        if (!this.playerContinueInBackground.get(playerId)) {
            MediaPlayer player = entry.getValue();
            player.pause();

            WritableMap info = getInfo(player);

            WritableMap data = new WritableNativeMap();
            data.putString("message", "Playback paused due to onHostPause");
            data.putMap("info", info);

            emitEvent(playerId, "pause", data);
        }
    }
}

我正在使用react 16.2.0react-native 0.53.3

谁能建议我如何解决这个错误?

标签: androidreact-native

解决方案


发生错误是因为在父级的每个子级中生成了相同音频文件的实例,导致ConcurrentModificationException. 只需在父组件中调用音频文件的一个实例,并在子组件中通过该实例调用它们。为我工作。


推荐阅读