1

一些用户在我的应用程序在线 threadAudio.start() 上遇到 (ANR keyDispatchingTimedOut) 错误

private void startAudio(int audioId) {

    mPlayer = MediaPlayer.create(this, audioId);

    mPlayer.setOnCompletionListener(new OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.stop();
            mp.release();
            mPlayer = null;
        }
    });

    mPlayer.start();
    vSeek.setMax(mPlayer.getDuration());

    threadAudio = new Thread(thread);
    threadAudio.start();
}

public Runnable thread = new Runnable() {
    public void run() {
        try {
            while(mPlayer != null){
                int currentPosition = mPlayer.getCurrentPosition();
                Message msg = new Message();
                msg.what = currentPosition;
                handler.sendMessage(msg);
            }
            Thread.sleep(100);
        } catch (Exception e) {
        }
    }
};

private Handler handler = new Handler() {
    public void handleMessage(Message msg){
        vSeek.setProgress(msg.what);
    }
};

首先,我无法在我的设备上重现错误!这可以是特定于设备的吗?

我正在按照 android doc 建议使用处理程序,以避免从 UI 线程外部访问 Android UI 工具包...

或者也许我必须在两行之间的某个地方调用 threadAudio.stop() ?

4

2 回答 2

1

我想你的意思是把Thread.sleep(100);你的while(mPlayer != null){循环?本质上,您的 while 循环不断向您的处理程序发送大量消息,该处理程序在 UIThread 上运行,这就是导致 ANR keyDispatchingTimedOut 错误的原因:所有 CPU 时间要么用于处理这些消息,要么用于发送这些消息。不是一个好地方:P

于 2012-05-07T10:49:32.637 回答
1

这是因为never ending while loop线程内部......你应该找到一种更好的方法来完成你的任务......具有较低ram内存的设备或具有大量应用程序的设备将无法为这样的代码制作内存..

于 2012-05-07T10:24:26.470 回答