android MediaPlayer NullPointerException

Hap*_*eer 5 android android-mediaplayer

解决这个问题对我来说有点困难,因为我是通过其他人的 android 设备的崩溃报告得到的,我无法向他们提问,而且我从未见过它发生在我自己的 android 设备上。

崩溃报告说它是 Android 4.1.2,堆栈跟踪是:

java.lang.NullPointerException
at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:2102)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5021)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

不幸的是,grepcode.com 上的 android 源代码似乎与这些行号不匹配,所以我不确定哪个是空的。

我不知道发生这种情况时用户在做什么,所以我不知道这是在播放音乐或音效时发生的,还是在破坏时发生的,还是什么。我有点怀疑它可能在销毁过程中发生。我在活动的 onDestroy 方法中有以下代码:

public void onDestroy() {
    synchronized(curPlayers) {
        for(List<MediaP> ms : curPlayers.values()) {
            synchronized(ms) {
                for(MediaP m : ms) {
                    synchronized(m) {
                        m.m.stop();
                        m.m.release();
                    }
                }
            }
        }
        curPlayers.clear();
    }
}

private static class MediaP {
    private MediaP(MediaPlayer m) {
        this.m = m;
    }

    private MediaPlayer m;
    private boolean wasPlaying = false;
}
Run Code Online (Sandbox Code Playgroud)

那里有我应该做的事情吗?

Dmi*_*try 5

删除对MediaPlayer.stop()before的调用release()。我们在 Nexus 4、5、7、10 和 Moto X 上看到了很多类似的崩溃。您可以在此处阅读更多信息MediaPlayer$EventHandler.handleMessage 中的 NullPointerException

据我了解,在某一时刻,他们切换到从 发送消息stop(),如果您足够不走运,您release()将在检查对象不为空并尝试调用其方法后立即取消该对象。