MP3项目,播放完就报错?
问题:播放完就报错。报错代码(PlayerService.java:152)是:message = (String) messages.poll();
log:
06-08 08:49:10.527: D/dalvikvm(22098): GC_EXTERNAL_ALLOC freed 126K, 51% free 2638K/5379K, external 2081K/2137K, paused 71ms
06-08 08:52:30.068: D/AndroidRuntime(22098): Shutting down VM
06-08 08:52:30.068: W/dalvikvm(22098): threadid=1: thread exiting with uncaught exception (group=0x40015560)
06-08 08:52:30.120: E/AndroidRuntime(22098): FATAL EXCEPTION: main
06-08 08:52:30.120: E/AndroidRuntime(22098): java.lang.NullPointerException
06-08 08:52:30.120: E/AndroidRuntime(22098): at napo.mp3player.service.PlayerService$UpdateTimeCallback.run(PlayerService.java:152)
06-08 08:52:30.120: E/AndroidRuntime(22098): at android.os.Handler.handleCallback(Handler.java:587)
06-08 08:52:30.120: E/AndroidRuntime(22098): at android.os.Handler.dispatchMessage(Handler.java:92)
06-08 08:52:30.120: E/AndroidRuntime(22098): at android.os.Looper.loop(Looper.java:123)
06-08 08:52:30.120: E/AndroidRuntime(22098): at android.app.ActivityThread.main(ActivityThread.java:3683)
06-08 08:52:30.120: E/AndroidRuntime(22098): at java.lang.reflect.Method.invokeNative(Native Method)
06-08 08:52:30.120: E/AndroidRuntime(22098): at java.lang.reflect.Method.invoke(Method.java:507)
06-08 08:52:30.120: E/AndroidRuntime(22098): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-08 08:52:30.120: E/AndroidRuntime(22098): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-08 08:52:30.120: E/AndroidRuntime(22098): at dalvik.system.NativeStart.main(Native Method)
06-08 08:57:30.247: I/Process(22098): Sending signal. PID: 22098 SIG: 9
相关代码:
public void run() {
// 计算偏移量
long offset = System.currentTimeMillis() - begin;
if (currentTimeMill == 0) {
nextTimeMill = (Long) times.poll();
message = (String) messages.poll();
}
if (offset >= nextTimeMill) {
Intent intent = new Intent();
intent.setAction(AppConstant.LRC_MESSAGE_ACTION);
intent.putExtra("lrcMessage", message);
sendBroadcast(intent);
message = (String) messages.poll();
nextTimeMill = (Long) times.poll();
}
currentTimeMill = currentTimeMill + 10;
handler.postDelayed(updateTimeCallback, 10);
[解决办法]
发文件:PlayerService.java上来
[解决办法]
这个代码和之前的出错提示对不上号,发最新的出错提示以及最新的代码上来。
[解决办法]
在
nextTimeMill = (Long) times.poll();
前面加一段
if(times != null)
[解决办法]
有2个地方都要加if(times != null)噢
private Handler handler = new Handler();
private UpdateTimeCallback updateTimeCallback = null;
private long begin = 0;
private long nextTimeMill = 0;
private long currentTimeMill = 0;
private long pauseTimeMills = 0;
private String message = null;
Queue times = null;
Queue messages = null;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Mp3Info mp3Info = (Mp3Info)intent.getSerializableExtra("mp3Info");
int MSG = intent.getIntExtra("MSG", 0);
if (mp3Info != null) {
if (MSG == AppConstant.PlayerMsg.PLAY_MSG) {
play(mp3Info);
} else {
if (MSG == AppConstant.PlayerMsg.PAUSE_MSG) {
pause();
} else if (MSG == AppConstant.PlayerMsg.STOP_MSG) {
stop();
}
}
}
return super.onStartCommand(intent, flags, startId);
}
private void play(Mp3Info mp3Info) {
if (!isPlaying) {
String path = getMp3Path(mp3Info);
mediaPlayer = MediaPlayer.create(this, Uri.parse("file://" + path));
mediaPlayer.setLooping(false);
mediaPlayer.start();
prepareLrc(mp3Info.getLrcName());
handler.postDelayed(updateTimeCallback, 5);
begin = System.currentTimeMillis();
isPlaying = true;
isReleased = false;
}
}
public void pause() {
if(isPlaying) {
mediaPlayer.pause();
System.out.println("pause---->");
handler.removeCallbacks(updateTimeCallback);
pauseTimeMills = System.currentTimeMillis();
} else {
mediaPlayer.start();
handler.postDelayed(updateTimeCallback, 5);
begin = System.currentTimeMillis() - pauseTimeMills + begin;
}
isPlaying = isPlaying ? false : true;
}
public void stop() {
if (mediaPlayer != null) {
if (isPlaying) {
if (!isReleased) {
handler.removeCallbacks(updateTimeCallback);
mediaPlayer.stop();
mediaPlayer.release();
isReleased = true;
}
isPlaying = false;
}
}
}
private String getMp3Path(Mp3Info mp3Info) {
String SDCardRoot = Environment.getExternalStorageDirectory()
.getAbsolutePath();
String path = SDCardRoot + File.separator + "mp3" + File.separator
+ mp3Info.getMp3Name();
return path;
}
private void prepareLrc(String lrcName) {
try {
InputStream inputStream = new FileInputStream(Environment
.getExternalStorageDirectory().getAbsoluteFile()
+ File.separator + "mp3/" + lrcName);
LrcProcessor lrcProcessor = new LrcProcessor();
queues = lrcProcessor.process(inputStream);
updateTimeCallback = new UpdateTimeCallback(queues);
begin = 0;
currentTimeMill = 0;
nextTimeMill = 0;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
class UpdateTimeCallback implements Runnable {
public UpdateTimeCallback(ArrayList<Queue> queues) {
times = queues.get(0);
messages = queues.get(1);
}
public void run() {
// 计算偏移量
long offset = System.currentTimeMillis() - begin;
if (currentTimeMill == 0) {
if(times != null)
nextTimeMill = (Long) times.poll();
message = (String) messages.poll();
}
if (offset >= nextTimeMill) {
Intent intent = new Intent();
intent.setAction(AppConstant.LRC_MESSAGE_ACTION);
intent.putExtra("lrcMessage", message);
sendBroadcast(intent);
message = (String) messages.poll();
if(times != null)
nextTimeMill = (Long) times.poll();
}
currentTimeMill = currentTimeMill + 10;
handler.postDelayed(updateTimeCallback, 10);
}
}
}