due modi:
In onPreExeccute()
di AsyncTask mostrano un ProgressDialog con il suo setCancelable(false)
. In onPostExecute()
di AsyncTask chiama dismiss()
su ProgressDialog. Questo mostrerà una finestra di dialogo di avanzamento del blocco. Puoi anche mostrare qualche messaggio o progresso qui.
In onPreExeccute()
di AsyncTask, chiamare setEnabled(false)
sul pulsante. In onPostExecute()
di AsyncTask chiama setEnabled(true)
su Button. Questo disabiliterà il pulsante finché l'attività è in esecuzione. Puoi anche cambiare il testo del pulsante in questi punti. O anche temporaneamente sostituirlo con uno spinner di progresso (come in ActionBar).
Inoltre, è possibile attivare o disattivare il pulsante tra "Esegui" e "Annulla", come il pulsante di aggiornamento nei browser Web moderni. Ciò darà più controllo all'utente.
Una nota di cautela: Avvolgere tutto all'interno onDoInBackground()
in un try-catch
, in modo che AsyncTask esce sempre normalmente, e onPostExecute()
viene sempre chiamato. Puoi giudicare dal parametro risultato di onPostExecute(result)
se la richiesta HTTP ha ottenuto qualcosa o no.
Esempio: basta chiamare questo metodo per caricare un po 'di testo in un TextView
dal server al clic di alcuni Button
:
public static void runHTTP(final TextView targetView, final Button triggerBtn){
//---new task----
AsyncTask<Void,Void,String> task = new AsyncTask<Void, Void, String>(){
@Override
protected void onPreExecute() {
super.onPreExecute();
//----disable button---
triggerBtn.setEnabled(false);
//---show message----
targetView.setText("Loading...");
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
//----update result---
targetView.setText(result);
//----re-enable button---
triggerBtn.setEnabled(true);
}
@Override
protected String doInBackground(Void... voids) {
//---default value--
String result = "No Data";
//--for safety--
try{
//-----do time consuming stuff here ---
}catch (Exception e){
//---error value--
result = "Error fetching data";
}
return result;
}
};
//----run task----
task.execute();
}
fonte
2012-11-27 09:06:34
un'istanza di AsyncTask non può essere eseguita più di una volta. – njzk2
@ njzk2 Ogni clic sul pulsante crea tuttavia una nuova istanza. – Johan
poi spetta a voi. Consiglio di disattivare il pulsante quando si fa clic e di riattivarlo solo quando è terminato l'asynctask (molto probabilmente in onPostExecute). Potresti anche avere una sola istanza asynctask. – njzk2