0

私は、さまざまな短い音楽ファイルを次々に再生する必要がある Android 用のアプリを設計しています。

「onClick」リスナーを設定して、これらの各サウンド ファイルを何度も再生するループを実行しました。100 回以上再生される可能性があります。

しかし

再生中にユーザーがアプリとやり取りできるようにする必要がありますが、現時点ではできません。ループが実行され、基本的に音楽ファイルの再生が完了するまでデバイスがフリーズします。

役立つ解決策への指針はありますか?

ループは基本的に次のとおりです。

mPlayButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public synchronized void onClick(View v) {

            for(char i: method.toCharArray()){
                mPlayer.play(getActivity(),Integer.parseInt(Character.toString(i)));
                try {
                    wait(500);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        }
    });
4

3 に答える 3

1

まず、MediaPlayer には設定可能な onCompletionListener があるため、スリープはここでタイミングを制御する方法ではありません。リソースの使用に注意する場合は、setNextMediaPlayer メソッドもあります (MediaPlayer をたくさん作成してすべて準備することはできません)。

次に、別の Thread または AsyncTask (新しい Thread を生成します) が必要です。特に指定しない限り、Service は UI と同じ Thread で実行されます。ほとんどの場合、不必要な複雑さのレイヤーが追加されるだけです。

最後に、SoundPool の使用を検討することをお勧めします。

于 2013-10-09T10:58:26.683 に答える
1

質問にコードを添付しなかったため、推測することしかできませんが、アプリケーションのメインスレッドである UI スレッドで実行されるループを実装したようです。1 つのスレッドが一度に 1 行のコードしか実行できず、コードを並列に実行できないため、アプリケーションがフリーズしているように見えます。あなたがしなければならないことは、音楽を再生するためのループが実行される別のスレッドを作成することです。これを達成するにはさまざまな方法があります。サービスを実装しようとする必要があると思います。Service を使用すると、別のスレッドでコードを実行できます。また、サービスと簡単に通信して、音楽の再生を開始または停止することもできます。サービスの詳細については、http: //developer.android.com/reference/android/app/Service.htmlをご覧ください。 また、Android サービスのチュートリアルをグーグルで検索することもできます。ウェブにはたくさんあります。幸運を!

于 2013-10-08T11:17:44.650 に答える