Risposte:
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
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
Non chiamare manualmente i metodi onPreExecute, doInBackground e onPostExecute. Questo viene fatto automaticamente dal sistema.
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.
Il metodo onPostExecute viene eseguito nel thread dell'interfaccia utente (qui puoi chiamare un altro AsyncTask!).
I parametri di input dell'attività possono essere una matrice di oggetti, in questo modo è possibile inserire qualsiasi oggetto e tipo desiderati.
WeakAsyncTask
così
Un'attività in AsyncTask
background 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 AsyncTask
con la firma corretta sarebbe un gioco da ragazzi.
Basta capire quali sono i tuoi Input , Progress e Output e sarai a posto.
doInBackgound()
Il metodo è il metodo più importante in un AsyncTask
perché
AsyncTask
parametri.Quindi vediamo la relazione
doInBackground()
eonPostExecute()
,onProgressUpdate()
sono anche correlati
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");
// show in spinner, access UI elements
era semplicemente la spiegazione più semplice per il onProgressUpdate(...)
:)
Fare riferimento ai seguenti collegamenti:
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
in breve, ci sono 3 parametri in AsyncTask
parametri per l'uso dell'input in DoInBackground (String ... params)
parametri per mostrare lo stato di avanzamento nell'OnProgressUpdate (stato String ...)
parametri per l'utilizzo dei risultati in OnPostExcute (String ... result)
Nota: - [Il tipo di parametri può variare in base alle proprie esigenze]