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);
    }
};

まず、デバイスでエラーを再現できません。これはデバイス固有にすることができますか?

UIスレッドの外部からAndroidUIツールキットにアクセスしないように、Androidドキュメントの提案に従ってハンドラーを使用しています...

または、行の間のどこかでthreadAudio.stop()を呼び出す必要がありますか?

4

2 に答える 2

1

スレッドの内部が原因ですnever ending while loop...タスクを実行するためのより良い方法を見つける必要があります...RAMメモリが少ないデバイスまたはアプリケーションが多いデバイスは、そのようなコードのメモリを作成できません。

于 2012-05-07T10:24:26.470 に答える
1

ループThread.sleep(100);の中に入れるつもりだったと思いますか?while(mPlayer != null){基本的に、whileループは、UIThreadで実行されるハンドラーにメッセージの軍隊を継続的に送信しています。これが、ANR keyDispatchingTimedOutエラーの原因です。すべてのCPU時間は、これらのメッセージの処理に費やされるか、これらのメッセージの送信に費やされます。:Pにいるのは良い場所ではありません

于 2012-05-07T10:49:32.637 に答える