Cómo utilizar AsyncTask correctamente en Android
No quiero pasar ningún argumento al método doInBackground
de AsyncTask.
Entonces, ¿cómo debería ser el código?
- Android AsyncTask Barra de progreso
- Android cómo esperar a que termine el código antes de continuar
- Barra de progreso de la actualización en listview para archivos múltiples descarga
- Android: AsyncTask ProgressDialog no se abrirá en ActivityGroup
- Android SDK AsyncTask doInBackground no está en ejecución (subclase)
- ¿Qué sucede con un AsyncTask cuando la actividad de lanzamiento se detiene / destruye mientras todavía se está ejecutando?
- AsyncTask dentro de un método estático - Buena práctica de codificación?
- Android: descarga el archivo desde el servidor y muestra el progreso de la descarga en la barra de notificación mediante AsyncTask
- Android cargar datos asincrónicamente en vista pager
- Asíntase múltiple de una actividad
- AsyncTask y setAdapter en métodos onCreate
- AsyncTask onPostExecute no se ejecuta en el hilo principal?
- Encriptación y bloqueo de bases de datos Android
import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; public class AsyncExample extends Activity{ private String url="http://www.google.co.in"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); new AsyncCaller().execute(); } private class AsyncCaller extends AsyncTask<Void, Void, Void> { ProgressDialog pdLoading = new ProgressDialog(AsyncExample.this); @Override protected void onPreExecute() { super.onPreExecute(); //this method will be running on UI thread pdLoading.setMessage("\tLoading..."); pdLoading.show(); } @Override protected Void doInBackground(Void... params) { //this method will be running on background thread so don't update UI frome here //do your long running http tasks here,you dont want to pass argument and u can access the parent class' variable url over here return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); //this method will be running on UI thread pdLoading.dismiss(); } } }
Según AsyncTask , su
AsyncTask<Params, Progress, Result>
- Params, el tipo de parámetros enviados a la tarea en ejecución.
- Progreso, el tipo de unidades de progreso publicadas durante la computación de fondo.
- Resultado, el tipo de resultado del cálculo de fondo.
Así que si quieres pasar void en doInBackground simplemente pasa vacío en lugar de Params.
Ejemplo de código:
class DownloadLink extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub //Do Your stuff here.. return null; } }
Y lo llaman como:
new DownloadLink().execute();
Cree su clase AsyncTask
como si no desea pasar ningún parámetro a doInBackground
:
public class LongOperation extends AsyncTask<Void, Void, String> { public LongOperation(Context context) { } @Override protected void onPreExecute() { } @Override protected String doInBackground(Void... params) { return null; } @Override protected void onPostExecute(String result) { } }
E iniciar AsyncTask como sin pasar ningún parámetro para ejecutar:
LongOperation longOperation = new LongOperation(this); longOperation.execute();
¿Por qué no quieres pasarle argumentos? Usted debe explicar …
Así es como funciona normalmente (ejemplo):
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); // Escape early if cancel() is called if (isCancelled()) break; } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } }
Y para ejecutarlo llamas:
new DownloadFilesTask().execute(url1, url2, url3);
Fuente: Android docs