有人能告诉我为什么这个类在我的主要活动中调用时会返回一个致命的异常吗?
package com.b1ackjosh.kana;
import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.widget.TextView;
public class SoundThread extends Thread implements Runnable, OnCompletionListener {
Thread t = null;
int place, lvl;
boolean tStatus = false;
Context context;
SoundThread(int l, int p, Context c) {
p = place;
c = context;
l = lvl;
};
public void run() {
MediaPlayer audioQuestion = MediaPlayer.create(context, QuestionArray.audioArray[lvl][place]);
audioQuestion.setOnCompletionListener(this);
audioQuestion.start();
};
public void pause() {
tStatus = false;
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t = null;
}
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.release();
}
}
这就是我在主要活动中运行它的方式:
public void playQuizAudio(final int i) {
new SoundThread(lvl, i, this).start();
}
我只是将一个整数传递给这个方法,每次运行它时,我的应用程序都会失败并崩溃到主屏幕。这很烦人,但如果我在我的主要活动中包含相同的代码它运行正常,但我认为我有一些其他的线程问题,这就是为什么我选择创建一个单独的类来管理它。此外,如果我使用音频中的静态链接也会失败,所以我知道它必须是上下文。对此的任何帮助将不胜感激。
这也是我从LogCat获得的:
04-12 03:52:43.981: E/AndroidRuntime(3129): FATAL EXCEPTION: Thread-98
04-12 03:52:43.981: E/AndroidRuntime(3129): java.lang.NullPointerException
04-12 03:52:43.981: E/AndroidRuntime(3129): at android.media.MediaPlayer.create(MediaPlayer.java:731)
04-12 03:52:43.981: E/AndroidRuntime(3129): at com.b1ackjosh.kana.SoundThread.run(SoundThread.java:23)
答案 0 :(得分:1)
java.lang.NullPointerException 04-12 03:52:43.981: E / AndroidRuntime(3129):at android.media.MediaPlayer.create(MediaPlayer.java:731)04-12 03:52:43.981:E / AndroidRuntime(3129):at com.b1ackjosh.kana.SoundThread.run(的 SoundThread.java:23 强>)
您在以下行获得了NullPointerException
:
MediaPlayer audioQuestion = MediaPlayer.create(context, QuestionArray.audioArray[lvl][place]);
假设context
,lvl
和place
变量都设置正确,(静态)字段QuestionArray.audioArray
可能未初始化(因此null
)当这一行被执行时。
答案 1 :(得分:1)
哎呀,你有:
SoundThread(int l, int p, Context c) {
p = place;
c = context;
l = lvl;
};
那是回到前面!它应该是:
SoundThread(int l, int p, Context c) {
place = p;
context = c;
lvl = l;
};
编译器本应该警告你,所以请注意它。此外:
public class SoundThread extends Thread implements Runnable
是多余的。选择其中一个,建议通常是Runnable
:
public class SoundThread implements Runnable