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.
- Android ProgressDialog con el problema de roscado
- Android Descargar Progress
- show ProgressBar o Dialog de un IntentService para el progreso de la descarga
- Mediaplayer actualización de progreso a seekbar no suave?
- No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare () dentro de AsyncTask para ProgressDialog
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?
- Mostrar / ocultar ProgresBar en ActionBar en android API inferior a 11
- AsyncTask onPostExecute no se ejecuta en el hilo principal?
- Utilizar la barra de progreso circular como alarmdialog o progressdialog
- ProgressDialog rechaza después de girar la pantalla
- Diálogo de progreso con asynctask
- Adición de un diálogo de progreso en una vista web
- Actualización del diálogo de progreso en Activity from AsyncTask
- Mostrar ProgressDialog Android
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