2012-09-13 13 views
9

Ho scritto un AsyncTask e la maggior parte delle volte non c'è alcun ritardo tra il suo costruttore chiamato e il suo doInBackground chiamato (ritardo di 0 ms). Ma ogni volta che la sincronizzazione dei contatti avviene in background, ho spesso un ritardo di 1-3 secondi tra il costruttore di AsyncTasks e doInBackground. Questo ritardo è inaccettabile nelle mie circostanze. Capisco che AsyncTask è un thread in background e questo problema può essere risolto usando Thread e impostando la sua priorità più alta. Ma quello che voglio scoprire è, come faccio a sapere che cosa sta causando il fatto che doInBackground del mio AsyncTask venga chiamato? Ho usato adb shell top -m 10 e l'utilizzo del processo sembra abbastanza normale quando si è verificato questo problema.Il doInBackground di AsyncTask inizia la sua esecuzione troppo tardi dopo che AsyncTask :: execute si chiama

Qualsiasi aiuto è apprezzato.

grazie

+0

IMO, comunemente verrà eseguito immediatamente, se è in esecuzione anche un altro thread, lo renderà molto più lento, quindi è meglio controllare i thread e sincronizzarli bene. – Tom

risposta

2

Noi in genere non si preoccupano pianificazione delle attività dalla JVM. E infatti non dobbiamo nemmeno preoccuparci.

Se qualcosa deve essere eseguito il più rapidamente possibile nella propria applicazione, farlo nel costruttore stesso o utilizzare onPre di Asynctask (ricordarsi di eseguirlo sul thread dell'interfaccia utente).

Ma sono d'accordo che c'è qualcosa di sospetto nel doInBackgroud che chiama Android AsyncTask io stesso ho visto che doInbackground non è stato chiamato dopo onPre. Puoi google anche questo. molte persone l'hanno affrontato. Mi sono trasferito per utilizzare Thread tradizionale.

Ho scritto il mio Asynctask usando il thread tradizionale al core e per imitare onPre e onPost ho usato Handler. Puoi andare anche per quell'opzione.

1

È importante distinguere tra la creazione e l'esecuzione dell'attività. (Un ha un metodo separato, come hai notato.)

Creare un thread è potenzialmente piuttosto costoso, quindi potresti trovare che creare l'attività in anticipo, e quindi solo eseguirlo a l'ora esatta, dà risultati migliori.

Se è probabile che l'operazione in background venga ripetuta spesso, è inoltre possibile che sia più adatto un IntentService, che gestisce le richieste una alla volta in un thread in background.

30

Ho anche affrontato questo problema per un lungo periodo, ma ora è risolto. Utilizzare il codice qui sotto

new AsyncTaskName().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

invece il codice

new AsyncTaskName().execute(); 

sarebbe risolvere il problema della corsa doInbackground ritardo.

+1

questo ha funzionato perfettamente per me. si prega di notare che questo è stato aggiunto in API 11 e l'avviso da: 'http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutorjava.util.concurrent.Executor, Params ...)' – Jayrox

+1

It è necessario notare che executeOnExecutor non può essere utilizzato con la versione API precedente come 11. Vedere la discussione http://stackoverflow.com/questions/9119627/android-sdk-asynctask-doinbackground-not-running-subclass/23678665#23678665 –

+0

@ Milan Shukla: grazie mille :-) –