1

これをいくつかの信号処理に使用しています。画面がオフになり、そのときにディスプレイが回転した場合を除いて、すべて正常に機能します。通常、画面オフはアクティビティ onPause() を生成するだけですが、画面が回転すると onPause()、onStop()、onDestroy()、onCreate()、onStart()、onResume()、onPause() になります。つまり、Android が最初に画面の「回転を解除」しているように見えます。

残念ながら、これにより AudioRecord がクラッシュまたはフリーズするようです。

私がすべてを操作する基本的な方法は、onResume() で新しいスレッドが開始され、これが AudioRecord インスタンスをインスタンス化し、セットアップし、録音を開始してからループに入るということです。

keepProcessing = true;

while (keepProcessing)
    //  read a block of data and process

UI スレッドの onPause() で keepProcessing (揮発性変数) がクリアされ、ワー​​カー スレッドが停止するのを待ちます。

if (thread.isAlive()) {
    keepProcessing = false;
    thread.join();
}

thread = null;

他のスレッドが keepProcessing ループから脱落すると、記録を停止し、AudioRecord リソースを解放し、AudioRecord インスタンスをドロップして終了します。

一般的な開始/停止メカニズムとして、これはすべて正常に機能します。ブレークポイントと adb でチェックすると、すべてが正しい順序で行われているようです。この画面回転シナリオでは機能しません。古いアクティビティですべてが停止した後、非常に高速な新しいアクティビティ onCreate() などが原因だとしか思えません。つまり、まだ使用中の AudioRecord に何かがあります。画面を再びオンにしようとすると、すべてがフリーズします。

実際に録音を開始しないように AudioRecord コードをダミーにすると、ループは停止してスリープ状態になり、再び録音を停止することはありません。すべて問題ありません。レコーダーが録音モードに入ると、問題が発生します。

何かアドバイス?

4

2 に答える 2

2

デバイスを回転させると、アクティビティが実際に停止して破棄されます。バックグラウンドスレッドが機能している場合、これは完全にあなたを台無しにします。android:configChange="orientation"これを修正する最善の方法は、そのアクティビティのマニフェストに追加して、Android にそれを行わないように指示することです 。ええ、これは Google による悪いアーキテクチャ上の決定であり、すべてのアクティビティにそれを追加することをほとんど提案するほど面倒です。

于 2013-02-18T19:11:38.820 に答える
0

はい、私はそれを見ることができます、そして私はちょうどそのようなことが起こっていたことを発見しました.

keepProcessing フラグが初期化されたときにエラーが発生したため、アクティビティが停止したときにバックグラウンド スレッドが実行されたままになる可能性がある競合状態がありました。

「[アクティビティが停止したときに] バックグラウンド スレッドが動作している場合、これはあなたを完全に台無しにします」

あなたは完全に正しいです。します。

于 2013-02-18T20:11:56.957 に答える