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.

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?

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); } 
  • ProgressDialog en AsyncTask lanza una excepción
  • Diálogo de progreso para AsyncTask - Android
  • El indicador de progreso indeterminado ActionBarSherlock no desaparecerá en el simulador
  • ¿Hay alguna forma de obtener el progreso de subida correctamente con HttpUrlConncetion?
  • Vista del temporizador android (al igual que la barra de progreso) actualizando con colores en Lienzo
  • No se puede tomar el progreso en la carga de archivos POST HTTP (Android)
  • Temporizador de cuenta atrás Android La barra de progreso circular no coincide con el temporizador
  • ¿Cómo puedo hacer que un ProgressDialog sea cancelable por el botón de retroceso pero no por un toque de pantalla?
  • Crear cuadro de diálogo con barra de progreso en android
  • ¿Cómo utilizar AsyncTask para mostrar un ProgressDialog mientras realiza un trabajo de fondo en Android?
  • No FEATURE_INDETERMINATE_PROGRESS en ActionBarCompat para Android 2.3-
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.