2011-02-07 13 views
12

nella mia applicazione, ho una classe per le cose dell'interfaccia utente, il cui nome è "SettingActivity".Perché AsyncTask viene eseguito nel thread principale di un'applicazione?

Quindi per eseguire alcuni lavori in background, associo questa classe di interfaccia utente (SettingActivity) a un servizio. Ci sono due metodi predefiniti in quel servizio (definiti nel file .aidl), uno è startTask(), l'altro è stopTask().

All'interno di startTask(), ho effettuato una chiamata a un AsyncTask. Ma quando ho controllato il nome del Looper di questo AsyncTask. È "principale". Secondo me, un AsyncTask dovrebbe iniziare un altro Thread diverso dal thread principale.

Così qualcuno sa perché questo accade?

I codici sono i seguenti:

@Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     Log.d(TAG, "onPreExecute "+Looper.myLooper().getThread().getName()); 
    } 

Then I will get main as the output.

+1

Sarebbe utile se si potesse inserire qualche codice di esempio. –

risposta

23

An AsyncTask has several parts: a doInBackground metodo che, di fatto, viene eseguito su un thread separato e un metodo onPostExecute che viene eseguito sul thread dell'interfaccia utente. Lo scopo di onPostExecute è di pubblicare risultati (come l'aggiornamento della gerarchia di visualizzazione o l'impostazione del testo in una visualizzazione testuale) che devono essere eseguiti sul thread dell'interfaccia utente. Può anche pubblicare aggiornamenti sullo stato di avanzamento. Affinché tutto funzioni correttamente, è necessario creare AsyncTask e il metodo execute nel thread dell'interfaccia utente.

Non è necessario chiamare le azioni dell'interfaccia dall'interno di doInBackground - così facendo si bloccherà l'applicazione.

+0

Grazie per la tua risposta. Mi ha davvero aiutato molto ~ – Mathieu

+0

Ad esempio, se voglio rendere Toast su un thread separato, cosa dovrei fare? – Behzad

+1

@Behzad - Se si dispone di un riferimento all'attività, è possibile utilizzare 'runOnUiThread' come descritto in [questa risposta] (http://stackoverflow.com/a/3134720/535871). –

6

In realtà, ho controllato il doc di Android, OnPreExecute(), onProgressUpdate (Progress ...) e OnPostExecute (Risultato) sono tutti "invocate sul thread dell'interfaccia utente".

Solo il metodo doInBackground (Params ...) è "richiamato sul thread in background".

Problemi correlati