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

Аз съм сравнително нов в програмирането с Android.

От моята дейност стартирам Asynctask, който прави това:

onPreExecute(): настройва AudioRecord и го подготвя за запис

doInBackground():

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 (отменя asynctask) и след това onCreate в бърза последователност.

Това, което вярвам, че се случва, е, че предишната Asynctask все още работи и не може да се отмени навреме и onCreate прави нова. Новият не може да стигне до микрофона, защото вече е зает от моята предишна асинхронна задача.

Има ли нещо, което мога да направя, за да направя това чисто?

Опитах да използвам android:configChanges="keyboardHidden|orientation" в AndroidManifest.xml, но от това, което прочетох, проблемът все още е налице... просто е маскиран при промяна на ориентацията.


person Bryce    schedule 05.11.2012    source източник
comment
Дългосрочно решение; преминете към фрагменти и AsyncTaskLoaders.   -  person Krylez    schedule 05.11.2012


Отговори (2)


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

person Raghunandan    schedule 05.11.2012
comment
Тръгвам по пътя на onRetaingNonConfigurationInstance() и запазвам моята asynctask и го презареждам на onCreate. Благодаря! - person Bryce; 06.11.2012

Когато ориентацията се промени, onCreate ще се задейства. Така че не стартирайте AsyncTask в onCreate, ако приложението ви има поддръжка за ориентация.

person Kavin Varnan    schedule 05.11.2012