问题:播放完就报错。报错代码(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);

解决方案 »

  1.   

    package napo.mp3player.service;import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Queue;import napo.lrc.LrcProcessor;
    import napo.model.Mp3Info;
    import napo.mp3player.AppConstant;
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.net.Uri;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.IBinder;public class PlayerService extends Service {
    private boolean isPlaying = false;
    private boolean isReleased = false;
    private MediaPlayer mediaPlayer = null; private ArrayList<Queue> queues = 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) {
    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);
    }
    }
    }
      

  2.   

    log:
    06-08 13:59:10.487: D/dalvikvm(335): GC_EXTERNAL_ALLOC freed 122K, 52% free 2630K/5379K, external 2081K/2137K, paused 81ms
    06-08 13:59:29.867: D/dalvikvm(370): GC_EXTERNAL_ALLOC freed 123K, 52% free 2630K/5379K, external 2081K/2137K, paused 188ms
    06-08 14:02:49.486: D/AndroidRuntime(370): Shutting down VM
    06-08 14:02:49.486: W/dalvikvm(370): threadid=1: thread exiting with uncaught exception (group=0x40015560)
    06-08 14:02:49.536: E/AndroidRuntime(370): FATAL EXCEPTION: main
    06-08 14:02:49.536: E/AndroidRuntime(370): java.lang.NullPointerException
    06-08 14:02:49.536: E/AndroidRuntime(370):  at napo.mp3player.service.PlayerService$UpdateTimeCallback.run(PlayerService.java:148)
    06-08 14:02:49.536: E/AndroidRuntime(370):  at android.os.Handler.handleCallback(Handler.java:587)
    06-08 14:02:49.536: E/AndroidRuntime(370):  at android.os.Handler.dispatchMessage(Handler.java:92)
    06-08 14:02:49.536: E/AndroidRuntime(370):  at android.os.Looper.loop(Looper.java:123)
    06-08 14:02:49.536: E/AndroidRuntime(370):  at android.app.ActivityThread.main(ActivityThread.java:3683)
    06-08 14:02:49.536: E/AndroidRuntime(370):  at java.lang.reflect.Method.invokeNative(Native Method)
    06-08 14:02:49.536: E/AndroidRuntime(370):  at java.lang.reflect.Method.invoke(Method.java:507)
    06-08 14:02:49.536: E/AndroidRuntime(370):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    06-08 14:02:49.536: E/AndroidRuntime(370):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    06-08 14:02:49.536: E/AndroidRuntime(370):  at dalvik.system.NativeStart.main(Native Method)
    06-08 14:02:53.796: I/Process(370): Sending signal. PID: 370 SIG: 9
    代码:
    package napo.mp3player.service;import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Queue;import napo.lrc.LrcProcessor;
    import napo.model.Mp3Info;
    import napo.mp3player.AppConstant;
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.net.Uri;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.IBinder;public class PlayerService extends Service {
    private boolean isPlaying = false;
    private boolean isReleased = false;
    private MediaPlayer mediaPlayer = null; private ArrayList<Queue> queues = 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) {
    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);
    }
    }
    }谢谢啦
      

  3.   


    nextTimeMill = (Long) times.poll();
    前面加一段
     if(times != null)
      

  4.   

    有2个地方都要加if(times != null)噢
      

  5.   

    package napo.mp3player.service;import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Queue;import napo.lrc.LrcProcessor;
    import napo.model.Mp3Info;
    import napo.mp3player.AppConstant;
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.net.Uri;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.IBinder;public class PlayerService extends Service {
     private boolean isPlaying = false;
     private boolean isReleased = false;
     private MediaPlayer mediaPlayer = null; private ArrayList<Queue> queues = 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);
     }
     }
    }
      

  6.   

    楼主我也遇到了跟你一样的问题。加了以后还是不行。然后我在nextTimeMill 下面打印出times.到了最后time的值是 "[]"。 并不是空的,请问应该怎么解决啊。谢谢了
      

  7.   

    解决了。添加这个:
    if(times.isEmpty()== false){
    nextTimeMill = (Long)times.poll();
    }
    这样的话就避免的空指针的问题,但是因为handler.postDelayed(updateTimeCallback, 10) 这个是一直在执行的,所以添加把最后一行改为
    if(times.isEmpty()==false)
    handler.postDelayed(updateTimeCallback, 10);
       else
    handler.removeCallbacks(updateTimeCallback);