2012-03-19 14 views
18

Ho due domande:Inizio Async task all'interno di un thread di lavoro

  • Possiamo iniziare/eseguire un Async task all'interno di un thread di lavoro?
  • In caso affermativo, i metodi onPreExecute(), onProgressUpdate(Progress...) e onPostExecute(Result) vengono richiamati sul thread dell'interfaccia utente?

Voglio sapere che perché ho una connessione TCP in esecuzione su un thread di lavoro e quando viene ricevuto un pacchetto che voglio cominciare un nuovo thread per fare il parsing di questo pacchetto e dopo che l'aggiornamento alcune strutture di dati sulla UI filo.

Grazie in anticipo!

+1

mentre AsyncTasks sono molto adatti per alcune cose, sembra che questa applicazione non è del tutto uno di loro. in alternativa, è possibile gestire solo sottoclassi della classe Thread – mfrankli

risposta

15

Dalle Android AsyncTask doc:

"L'istanza compito deve essere creato sul thread UI", e

"eseguire (Parametri ...) deve essere richiamato nel thread UI".

Quindi penso che la risposta alla tua prima domanda sia "no". Per quanto riguarda il secondo, quei metodi sono tutti invocati sul thread dell'interfaccia utente, ma è un po 'discutibile.

MODIFICA: Non sono sicuro che si tratti di restrizioni assolute o di suggerimenti forti, ma in entrambi i casi, consiglierei di seguirli.

5

Secondo Android Doco è necessario eseguire un AsyncTask da un thread dell'interfaccia utente, ma in realtà dipende da chi gestisce questa linea in AsyncTask.class prima:

private static final InternalHandler sHandler = new InternalHandler(); 

Se si dispone di un AsyncTask che viene chiamato sia dall'interfaccia utente sia dal thread di lavoro, è possibile aggirare questa limitazione chiamandola prima dal thread dell'interfaccia utente. Se lo colpisci per primo dal tuo filo conduttore, sei condannato. Preferisco non fare affidamento su questo dato che i dettagli di implementazione possono cambiare in qualsiasi momento, ma questa conoscenza è utile se tu, come me, ti chiedessi "perché il mio altro AsyncTask funziona".

4

Dal doc AsyncTask Android:

"L'istanza compito deve essere creato sul thread dell'interfaccia utente", e

"execute (Params ...) deve essere richiamato sul thread UI ".

Quindi, quanto segue è legale.

new Thread(new Runnable() { 
       @Override 
       public void run() { 
        // do some work here 

        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          new MyAsyncTask(ctx).execute(); 
         } 
        }); 
       } 
      }).start(); 
+0

Questo è inutile, quindi -1. Stai iniziando una discussione da un thread principale, che delega l'esecuzione di un'attività al thread principale ... Stessa cosa sarebbe se eseguissi semplicemente 'new MyAsyncTask (ctx) .execute();' invece di tutto quel codice inutile. – Cipi

+1

@Cipi Credo che stava solo indicando che è possibile chiamare "runOnUiThread" da qualsiasi thread di lavoro. (visto il commento '// fai un po 'di lavoro qui') –

4

solo per la cronaca: Se si avvia un AsyncTask al di fuori della UI-passare il OnPreExecute non verrà eseguita dall'interfaccia utente-Thread (ma dal thread chiamante). Questo porterà ad un'eccezione. Tuttavia, il metodo onPostExecute verrà sempre eseguito sul thread UI. Spero di aiutare qualcuno :)

0

In semplice, possiamo avviare AsyncTask in un worker. Puoi semplicemente eseguire un AsyncTask in una nuova discussione, molto semplice. La ragione è nel codice sorgente di Android: [clike here]

private static class InternalHandler extends Handler { 
    public InternalHandler() { 
     super(Looper.getMainLooper()); 
    } 
} 
Problemi correlati