Cancelar ProgressDialog y detener el hilo
Tengo un hilo que ejecuta varias operaciones una vez y me gustaría detenerlo cuando el usuario cancela el ProgressDialog
.
public void run() { //operation 1 //operation 2 //operation 3 //operation 4 }
Este hilo se ejecuta sólo una vez, por lo que no puedo implementar un bucle para comprobar si el hilo todavía debe estar ejecutándose.
- Pasar argumentos a AsyncTask y devolver resultados
- Cambio del mensaje de diálogo de progreso durante la ejecución
- Mediaplayer actualización de progreso a seekbar no suave?
- ¿Hay alguna forma de obtener el progreso de subida correctamente con HttpUrlConncetion?
- No puedo ver el progreso de spinner en ProgressDialog en Lollipop
Aquí está mi ProgressDialog:
//Wait dialog m_dlgWaiting = ProgressDialog.show(m_ctxContext, m_ctxContext.getText(R.string.app_name), m_ctxContext.getText(R.string.msg_dlg_analyse_pic), true, //indeterminate true, new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { m_bRunning = false; } });
Como no sé cómo detener el hilo, ¿sería correcto secuenciar las operaciones del hilo a través de un bucle para ver si aún debería estar ejecutándose, o hay una mejor manera?
public void run() { int op = 0; while(m_bRunning) { switch(op) { case 0 : //operation 1 break; case 1 : //operation 2 break; case 2 : //operation 3 break; case 3 : //operation 4 break; } op++; } }
Incluso con esta solución, si hay demasiadas operaciones en el hilo, podría ser difícil secuenciar las operaciones. ¿Hay una mejor manera de lograr esto?
- El indicador de progreso indeterminado ActionBarSherlock no desaparecerá en el simulador
- Android Descargar Progress
- Diálogo de progreso para AsyncTask - Android
- Temporizador de cuenta atrás Android La barra de progreso circular no coincide con el temporizador
- Android ExoPlayer onProgressChanged
- Android ProgressDialog no funciona con la red móvil
- ¿Cómo se puede generar una pantalla de carga en Android?
- Actualización del diálogo de progreso en Activity from AsyncTask
Utilice callbacks o AsyncTask
http://developer.android.com/reference/android/os/AsyncTask.html
final AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { private ProgressDialog dialog; @Override protected void onPreExecute() { this.dialog = new ProgressDialog(context); this.dialog.setMessage("Loading..."); this.dialog.setCancelable(true); this.dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { // cancel AsyncTask cancel(false); } }); this.dialog.show(); } @Override protected Void doInBackground(Void... params) { // do your stuff return null; } @Override protected void onPostExecute(Void result) { //called on ui thread if (this.dialog != null) { this.dialog.dismiss(); } } @Override protected void onCancelled() { //called on ui thread if (this.dialog != null) { this.dialog.dismiss(); } } }; task.execute();
Puede utilizar Asynctask como a continuación
FetchRSSFeeds fetchRss = new FetchRSSFeeds() fetchRss.execute(); private class FetchRSSFeeds extends AsyncTask<String, Void, Boolean> { private ProgressDialog dialog = new ProgressDialog(HomeActivity.this); /** progress dialog to show user that the backup is processing. */ /** application context. */ protected void onPreExecute() { this.dialog.setMessage(getResources().getString( R.string.Loading_String)); this.dialog.show(); } protected Boolean doInBackground(final String... args) { try { /** * Write your RUN method code here */ if (isCancelled()) { if (dialog.isShowing()) { dialog.dismiss(); } } return true; } catch (Exception e) { Log.e("tag", "error", e); return false; } } @Override protected void onPostExecute(final Boolean success) { } }
Y cuando quiera cancelar su proceso de fondo haga abajo
if (fetchRss.getStatus() == AsyncTask.Status.RUNNING) { fetchRss.cancel(true); }
- Programáticamente, ¿Cómo identificar si un faro pertenece a Eddystone o iBeacon?
- Cambiar dinámicamente la clave de manifiesto de depuración / liberación para cada sabor