![](/img/trans.png)
[英]NullPointerException with android 2.3.3 mediaplayer
[英]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();
}
});
似乎無法創建MediaPlayer
, create()
方法返回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.
}
}
恐怕這里的所有答案都是錯誤的。 我遇到了這個問題,雖然是在一年多之后,但經過一番研究找到了答案。 它分為兩部分。
- 最好在聲明 onCompleteListener 之后啟動媒體播放器。 這確保了媒體播放器在開始播放之前就已經聲明了完整的指令列表。
- 使用稱為 AtomicBoolean 的靜態聲明的 object。 這確保了只有一個 boolean 參數,並且進程被鎖定直到它完成進程。 這是確保進程是線程安全的唯一方法。
希望您發現這很有用(所有未來遇到此問題的程序員);-)
要解決您的問題,您可以嘗試編寫權限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在清單中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.