AsyncTask
ユーザーがアプリケーションを強制終了するか、バックグラウンドに移動するときに、使用されているメモリをクリーンアップする方法に少し問題があります。
具体的には、AsyncTask
オーディオ データを記録し、信号をリアルタイムでグラフ化するために を使用しているアプリがあります。記録のために、クラスを使用してAudioRecord
います。このクラスでは、記録を開始してから、記録オブジェクトを停止して解放する必要があります。私の問題は、このオブジェクトを停止して解放する方法がわからないことです。
私が考えて試したオプション:
onPause
、onStop
、メソッドでオブジェクトの解放を停止しますonDestroy
が、これにより例外が発生します。onPostExecute
のメソッドでオブジェクトを停止して解放しますAsyncTask
。これに関する問題は、メソッドが終了しないため、ユーザーが強制的にアプリを終了したときにこのメソッドが呼び出されるかどうかわからないことですdoInBackground
。これに関するドキュメントは見つかりませんでした。
私AsyncTask
の見た目は次のとおりです。
AsyncTask<Void, Void, Void> drawer = new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
recorder.startRecording();
}
@Override
protected Void doInBackground(Void... arg0) {
while(true) {
int nRead = 0;
int offset = 0;
while(nRead != readSize) {
nRead += recorder.read(buffer, offset + nRead, readSize - nRead);
}
for(int i = 0; i < readSize; i++) {
data[i] = buffer[i];
}
publishProgress();
}
}
@Override
protected void onProgressUpdate(Void... arg0) {
view.setData(data);
view.invalidate();
}
};
コードはうまく機能します。記録オブジェクトを適切にクリーンアップし、まったくリークしないようにする最善の方法がわかりません。私の混乱は、UI スレッドが一時停止または停止したときにどうなるか、さらに、別のスレッドからオブジェクトAsyncTask
を停止できる場合にどうなるかということです。AudioRecord
どんな助けでも大歓迎です。
ありがとうございました、