线程的ANR错误

时间:2012-05-07 10:20:55

标签: android process

有些用户在我的应用上线上获得(ANR keyDispatchingTimedOut)错误threadAudio.start()

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()?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我认为您打算将Thread.sleep(100);置于while(mPlayer != null){循环中?基本上你的while循环不断向你的处理程序发送军队消息给你的处理程序,它在UIThread上运行,这就是导致ANR keyDispatchingTimedOut错误的原因:所有的CPU时间都花在处理这些消息上,或者用于发送这些消息。不是一个好地方:P