簡體   English   中英

使用 Android 的媒體播放器時出現 NullPointerException

[英]NullPointerException while using Android's mediaplayer

我有兩個按鈕,它會播放聲音來通知正確的選擇,或者錯誤的選擇。 我就是這樣做的:

MediaPlayer playError = MediaPlayer.create(QuizActivity.this, R.raw.error);
playError.start();

與正確的聲音相同。 它在大多數情況下都可以正常工作,但是當我多次單擊它時,會隨機出現此錯誤:

基本上它說 line playError.start(); 給我NullPointerException (僅有時)

07-21 23:05:32.767: ERROR/PlayerDriver(1287): Command PLAYER_PREPARE completed with an error or info PVMFErrResource, -17
07-21 23:05:32.767: ERROR/MediaPlayer(14449): error (1, -17)
07-21 23:05:32.767: ERROR/MediaPlayer(14449): MEDIA_ERROR(mPrepareSync) signal application thread
07-21 23:05:32.777: ERROR/AndroidRuntime(14449): FATAL EXCEPTION: main
07-21 23:05:32.777: ERROR/AndroidRuntime(14449): java.lang.NullPointerException
07-21 23:05:32.777: ERROR/AndroidRuntime(14449):     at com.quiz.QuizActivity.falseAnswerPoints(QuizActivity.java:148)
07-21 23:05:32.777: ERROR/AndroidRuntime(14449):     at com.quiz.QuizActivity$5.onClick(QuizActivity.java:86)
07-21 23:05:32.777: ERROR/AndroidRuntime(14449):     at android.view.View.performClick(View.java:2408)
07-21 23:05:32.777: ERROR/AndroidRuntime(14449):     at android.view.View$PerformClick.run(View.java:8816)
07-21 23:05:32.777: ERROR/AndroidRuntime(14449):     at android.os.Handler.handleCallback(Handler.java:587)
07-21 23:05:32.777: ERROR/AndroidRuntime(14449):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-21 23:05:32.777: ERROR/AndroidRuntime(14449):     at android.os.Looper.loop(Looper.java:123)
07-21 23:05:32.777: ERROR/AndroidRuntime(14449):     at android.app.ActivityThread.main(ActivityThread.java:4627)
07-21 23:05:32.777: ERROR/AndroidRuntime(14449):     at java.lang.reflect.Method.invokeNative(Native Method)
07-21 23:05:32.777: ERROR/AndroidRuntime(14449):     at java.lang.reflect.Method.invoke(Method.java:521)
07-21 23:05:32.777: ERROR/AndroidRuntime(14449):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-21 23:05:32.777: ERROR/AndroidRuntime(14449):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-21 23:05:32.777: ERROR/AndroidRuntime(14449):     at dalvik.system.NativeStart.main(Native Method)

編輯:

第 148 行:playError.start();

而 falseAnswerPoints() 是:

public void falseAnswerPoints() {
    MediaPlayer playError = MediaPlayer.create(QuizActivity.this, R.raw.error);
    playError.start();
}

同樣是正確的答案點,但聲音不同。 就是這樣。 有時它給 NullPointerException 一個,有時另一個......

回答:

MediaPlayer playSuccess = MediaPlayer.create(QuizActivity.this, R.raw.success);
playSuccess.start();
playSuccess.setOnCompletionListener(new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer playSuccess) {
        playSuccess.release();
    }
});

似乎無法創建MediaPlayercreate()方法返回null指針。 官方文檔說創建失敗時會發生這種情況,沒有進一步的細節。

您說當您連續多次單擊導致調用此方法的按鈕時會發生這種情況。 這可能是由於不可重入問題。

您應該嘗試用一個可以防止重入的標志來包圍MediaPlayer的創建和使用:

public void falseAnswerPoints() {
    if (!mPlayingSound) {
        mPlayingSound = true;

        MediaPlayer playError = MediaPlayer.create(QuizActivity.this, R.raw.error);
        playError.start();
    }
}

mPlayingSound是一個private boolean成員,初始化為false ,一旦MediaPlayer完成播放,您將重置為false (使用public void setOnCompletionListener (MediaPlayer.OnCompletionListener listener)應該沒問題,盡管我不確定是否在以下情況下調用它比賽的異常或預期終止)。

編輯:有一個 NullPointerException 所以有一個堆棧跟蹤。 要捕獲堆棧跟蹤,僅在調試中(下面的代碼不適合發布),您可以執行以下操作:

public void falseAnswerPoints() {
    try {
        MediaPlayer playError = MediaPlayer.create(QuizActivity.this, R.raw.error);
        playError.start();
    }
    catch (NullPointerException e) {
        // Set a breakpoint there to inspect the state of your app
        // Then rethrow the exception to have it logged, and why not
        // log extra info.
    }
}

恐怕這里的所有答案都是錯誤的。 我遇到了這個問題,雖然是在一年多之后,但經過一番研究找到了答案。 它分為兩部分。

  1. 最好在聲明 onCompleteListener 之后啟動媒體播放器。 這確保了媒體播放器在開始播放之前就已經聲明了完整的指令列表。
  2. 使用稱為 AtomicBoolean 的靜態聲明的 object。 這確保了只有一個 boolean 參數,並且進程被鎖定直到它完成進程。 這是確保進程是線程安全的唯一方法。

希望您發現這很有用(所有未來遇到此問題的程序員);-)

要解決您的問題,您可以嘗試編寫權限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

在清單中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM