Асинтаск после изменения конфигурации

Я новичок в программировании для Android.

Из моей деятельности я запускаю асинтаск, который делает это:

onPreExecute(): настраивает AudioRecord и готовит его к записи.

сделать в фоновом режиме():

while (!isCancelled())    {
    try
    {     
        shortsRead = recorder.read(intputbuffer,0,size);
        if (shortsRead <= 0)  {
            Log.e("AudioRead", "Audioread failed buffersize tried:" + " Sizeread:" + shortsRead);

           recorder.stop();
           recorder.release();
           Thread.sleep(500); 
           int bufferSizeInBytes = 4096 * 2;
           recorder = new AudioRecord(AudioSource.MIC, sampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes);
           recorder.startRecording();

        }
    }
    catch(Throwable x)
    { 
         Log.w("Audio", "Error reading voice audio", x);
    }

}
recorder.stop();
recorder.release();
Log.i("Audio", "Killed Audio Thread");

Когда я меняю конфигурацию (переключаю ориентацию), он запускается onDestroy (отменяет асинхронную задачу), а затем быстро последовательно onCreate.

Я считаю, что предыдущая асинтаска все еще работает и не может быть отменена вовремя, а onCreate создает новую. Новый не может добраться до микрофона, потому что он уже занят моей предыдущей асинтаской.

Есть ли что-то, что я могу сделать, чтобы сделать это чисто?

Я пытался использовать android:configChanges="keyboardHidden|orientation" в AndroidManifest.xml, но из того, что я читал, проблема все еще существует... она просто маскируется при изменении ориентации.


person Bryce    schedule 05.11.2012    source источник
comment
Долгосрочное решение; переключитесь на Фрагменты и AsyncTaskLoaders.   -  person Krylez    schedule 05.11.2012


Ответы (2)


Как обрабатывать AsyncTask во время поворота экрана?. взгляните на комментарий Ромена Гая. Также взгляните на эту ссылку. https://groups.google.com/forum/?fromgroups=#!topic/android-developers/4dW4-KMUKJI. Это должно помочь вам.

person Raghunandan    schedule 05.11.2012
comment
Я иду по пути onRetaingNonConfigurationInstance(), сохраняю свою асинхронную задачу и перезагружаю ее в onCreate. Спасибо! - person Bryce; 06.11.2012

Когда ориентация изменится, onCreate будет запущен. Поэтому не запускайте AsyncTask в onCreate, если ваше приложение поддерживает ориентацию.

person Kavin Varnan    schedule 05.11.2012