【问题标题】:ANR error with Threads线程的 ANR 错误
【发布时间】:2012-05-07 10:20:54
【问题描述】:

我的应用在 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 文档建议使用处理程序,以避免从 UI 线程外部访问 Android UI 工具包...

或者我必须在两行之间调用 threadAudio.stop()?

【问题讨论】:

    标签: android process


    【解决方案1】:

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

    【讨论】:

    • 试试把 Thread.sleep(100); while 循环中,看看它是如何执行的。
    【解决方案2】:

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

    【讨论】:

    • 我需要搜索栏随着播放音频的持续时间移动...而当音频停止时 while 循环结束...有更好的解决方案吗?\
    猜你喜欢
    • 2012-04-19
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多