0

到目前为止,我的应用程序非常简单。只是一个播放声音的按钮。问题是,如果我按下按钮太快,我会收到错误消息并且媒体播放器不再响应。

这是我的代码。

public class Keyboard extends Activity
{
    private MediaPlayer player = null;

    private OnTouchListener listener = new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent e) {
            switch (e.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                System.out.println("down");
                player.start();
                break;
            case MotionEvent.ACTION_UP:
                System.out.println("up");
                player.pause();
                break;
            }
            return false;
        }
    };

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        player = MediaPlayer.create(getApplicationContext(),
                R.raw.bloop);
        player.setLooping(true);

        Button foo = (Button)findViewById(R.id.A);
        foo.setOnTouchListener(listener);
    }
}

我所做的只是在按下按钮时调用 play(),在松开按钮时调用 pause()。这是典型日志的示例。

I/System.out( 1796): up
I/System.out( 1796): down
I/System.out( 1796): up
I/System.out( 1796): down
I/System.out( 1796): up
W/TimedEventQueue(   38): Event 2 was not found in the queue, already cancelled?
I/System.out( 1796): down
I/System.out( 1796): up
I/System.out( 1796): down
I/System.out( 1796): up

如您所见,我的调试语句在出错后仍然有效,因此 OnTouchListener 仍然有效。

4

1 回答 1

0

从错误日志中,即MediaPlayer Event 11 was not found in the queue, already cancelled是警告而不是错误。请参考此链接。因此,如果您MediaPlayer正在退出,那么应该还有其他问题。

event当预期从实际触发之前triggered删除的an 时,将打印此警告。queue这可能在多种情况下发生。例如,在 的情况下,所有玩家事件都被取消,如此pause所示。

在你的情况下,我觉得可能的情况之一就是这样。AwesomePlayer会触发event从视频解码器读取下一个视频帧,即mVideoSource。在你按下pause这导致所有事件被删除之间。因此,当TimedEventQueue在此循环中触发时threadRun,它会观察到它event已被删除,因此日志。

于 2013-03-26T00:35:34.290 回答