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); } 
  • AsyncTask o Handler- ¿Cuál es mejor para la interacción y el procesamiento de la red que consumen mucho tiempo?
  • Ocultar la barra de progreso del área de notificación en android cuando se completa el 100%
  • ProgressDialog Actividad de fondo Fade Out Animation
  • Barra de progreso personalizada en Android?
  • ProgressDialog en AsyncTask
  • Ancho horizontal de la barra de progreso en la barra de acciones
  • Android seekbar establecer estilo personalizado con nueve imágenes de parche
  • No FEATURE_INDETERMINATE_PROGRESS en ActionBarCompat para Android 2.3-
  • Progreso de la ventana de presentación pero no Progreso de ActionBar (utilizando la biblioteca v7 compat)
  • FindViewById (android.R.id.progress) devuelve null
  • ¿Cómo utilizar AsyncTask para mostrar un ProgressDialog mientras realiza un trabajo de fondo en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.