Quali argomenti vengono passati in AsyncTask <arg1, arg2, arg3>?


157

Non capisco cosa dovrei mettere qui e dove finiscono questi argomenti? Cosa devo mettere esattamente e dove andrà esattamente? Devo includere tutti e 3 o posso includere 1,2,20?

Risposte:


496

La documentazione Android di Google afferma che:

Un'attività asincrona è definita da 3 tipi generici, chiamati Params, Progress and Result e 4 passaggi, chiamati onPreExecute, doInBackground, onProgressUpdate e onPostExecute.

Tipi generici di AsyncTask:

I tre tipi utilizzati da un'attività asincrona sono i seguenti:

Params, the type of the parameters sent to the task upon execution.
Progress, the type of the progress units published during the background computation.
Result, the type of the result of the background computation.

Non tutti i tipi sono sempre utilizzati da un'attività asincrona. Per contrassegnare un tipo come non utilizzato, utilizzare semplicemente il tipo Void:

 private class MyTask extends AsyncTask<Void, Void, Void> { ... }

È possibile fare riferimento ulteriormente: http://developer.android.com/reference/android/os/AsyncTask.html

Oppure puoi chiarire qual è il ruolo di AsyncTask facendo riferimento al Blog di Sankar-Ganesh

Bene, la struttura di una tipica classe AsyncTask è la seguente:

private class MyTask extends AsyncTask<X, Y, Z>

    protected void onPreExecute(){

    }

Questo metodo viene eseguito prima di iniziare il nuovo thread. Non ci sono valori di input / output, quindi basta inizializzare le variabili o qualunque cosa tu pensi di dover fare.

    protected Z doInBackground(X...x){

    }

Il metodo più importante nella classe AsyncTask. Devi mettere qui tutte le cose che vuoi fare in background, in un thread diverso da quello principale. Qui abbiamo come valore di input una matrice di oggetti del tipo "X" (vedi nell'intestazione? Abbiamo "... estende AsyncTask" Questi sono i TIPI dei parametri di input) e restituisce un oggetto dal tipo “Z”.

   protected void onProgressUpdate(Y y){

   }

Questo metodo viene chiamato utilizzando il metodo publishingProgress (y) e di solito viene utilizzato quando si desidera mostrare qualsiasi progresso o informazione nella schermata principale, come una barra di avanzamento che mostra l'avanzamento dell'operazione in corso in background.

  protected void onPostExecute(Z z){

  }

Questo metodo viene chiamato al termine dell'operazione in background. Come parametro di input riceverai il parametro di output del metodo doInBackground.

E i tipi X, Y e Z?

Come puoi dedurre dalla struttura sopra:

 X  The type of the input variables value you want to set to the background process. This can be an array of objects.

 Y  The type of the objects you are going to enter in the onProgressUpdate method.

 Z  The type of the result from the operations you have done in the background process.

Come possiamo chiamare questo compito da una classe esterna? Solo con le seguenti due righe:

MyTask myTask = new MyTask();

myTask.execute(x);

Dove x è il parametro di input di tipo X.

Una volta che abbiamo il nostro compito in esecuzione, possiamo scoprire il suo stato da "fuori". Utilizzando il metodo "getStatus ()".

 myTask.getStatus();

e possiamo ricevere il seguente stato:

IN ESECUZIONE : indica che l'attività è in esecuzione.

IN ATTESA : indica che l'attività non è stata ancora eseguita.

FINITO - Indica che OnPostExecute (Z) è terminato.

Suggerimenti sull'uso di AsyncTask

  1. Non chiamare manualmente i metodi onPreExecute, doInBackground e onPostExecute. Questo viene fatto automaticamente dal sistema.

  2. Non è possibile chiamare un AsyncTask all'interno di un altro AsyncTask o Thread. La chiamata del metodo execute deve essere eseguita nel thread dell'interfaccia utente.

  3. Il metodo onPostExecute viene eseguito nel thread dell'interfaccia utente (qui puoi chiamare un altro AsyncTask!).

  4. I parametri di input dell'attività possono essere una matrice di oggetti, in questo modo è possibile inserire qualsiasi oggetto e tipo desiderati.


20
Spiegazione perfetta amico
Kalai.G il

30
Meglio di Google.
Diolor,

25
+1. SO membri, prendete nota. Questo è come si spiega. Sebbene sia lungo, è estremamente facile da capire. Grazie Kartik.
Subby,

3
Bella spiegazione, ora sono molto chiaro su Asyntask. :) Grazie Kartik
Reena,

2
Questo mi ha chiarito molte cose, ottima risposta!
Michael

80

Sono troppo tardi per la festa, ma ho pensato che questo potesse aiutare qualcuno.


7
Questa immagine è stata estremamente utile. Inizierò a utilizzare più elementi visivi come questo per mostrare come i Tipi e le loro variabili correlate sono collegati quando il flusso di codice non è semplice o la tecnica o il modello non sono comuni. Spero che altri facciano di più. Grazie
Kent Lauridsen,

Bella grafica, puoi aggiungere anche per WeakAsyncTask?
kAmol,

1
@kAmol sicuro, proverò a fare un flusso per WeakAsyncTaskcosì
mrid

4
Un giorno incornicerò questo e lo metterò sul mio muro in modo da non dover continuare a tornare su questa discussione per riferimento.
Matt Robertson,

14

Mantienilo semplice!

Un'attività in AsyncTaskbackground che viene eseguita nel thread in background. Prende un input , esegue Progress e dà Output .

vale a dire AsyncTask<Input,Progress,Output>.

Secondo me la principale fonte di confusione arriva quando proviamo a memorizzare i parametri in AsyncTask.
La chiave è non memorizzare .
Se riesci a visualizzare ciò che il tuo compito deve davvero fare, scrivere AsyncTaskcon la firma corretta sarebbe un gioco da ragazzi.
Basta capire quali sono i tuoi Input , Progress e Output e sarai a posto.

Per esempio: inserisci qui la descrizione dell'immagine

Heart of the AsyncTask!

doInBackgound()Il metodo è il metodo più importante in un AsyncTaskperché

  • Solo questo metodo viene eseguito nel thread in background e pubblica i dati nel thread dell'interfaccia utente.
  • La sua firma cambia con i AsyncTaskparametri.

Quindi vediamo la relazione

inserisci qui la descrizione dell'immagine

doInBackground()e onPostExecute(), onProgressUpdate()sono anche correlati

inserisci qui la descrizione dell'immagine

Mostrami il codice
Quindi come scriverò il codice per DownloadTask?

DownloadTask extends AsyncTask<String,Integer,String>{

      @Override
      public void onPreExecute()
      {}

      @Override
      public String doInbackGround(String... params)
      {
               // Download code
               int downloadPerc = // calculate that
               publish(downloadPerc);

               return "Download Success";
      }

      @Override
      public void onPostExecute(String result)
      {
          super.onPostExecute(result);
      }

      @Override
      public void onProgressUpdate(Integer... params)
      {
             // show in spinner, access UI elements
      }

}

Come eseguirai questa attività

new DownLoadTask().execute("Paradise.mp3");

1
// show in spinner, access UI elementsera semplicemente la spiegazione più semplice per il onProgressUpdate(...):)
Volkan Güven

5

Fare riferimento ai seguenti collegamenti:

  1. http://developer.android.com/reference/android/os/AsyncTask.html
  2. http://labs.makemachine.net/2010/05/android-asynctask-example/

Non è possibile passare più di tre argomenti, se si desidera passare solo 1 argomento, utilizzare void per gli altri due argomenti.

1. private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> 


2. protected class InitTask extends AsyncTask<Context, Integer, Integer>

Un'attività asincrona è definita da un calcolo che viene eseguito su un thread in background e il cui risultato è pubblicato sul thread dell'interfaccia utente. Un'attività asincrona è definita da 3 tipi generici, chiamati Params, Progress and Result e 4 passaggi, chiamati onPreExecute, doInBackground, onProgressUpdate e onPostExecute.

KPBird


3
  • in breve, ci sono 3 parametri in AsyncTask

    1. parametri per l'uso dell'input in DoInBackground (String ... params)

    2. parametri per mostrare lo stato di avanzamento nell'OnProgressUpdate (stato String ...)

    3. parametri per l'utilizzo dei risultati in OnPostExcute (String ... result)

    Nota: - [Il tipo di parametri può variare in base alle proprie esigenze]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.