Espere a que el hilo en línea termine antes de pasar al siguiente método
Tengo una aplicación para Android donde estoy haciendo lo siguiente:
private void onCreate() { final ProgressDialog dialog = ProgressDialog.show(this, "Please wait..", "Doing stuff..", true); new Thread() { public void run() { //do some serious stuff... dialog.dismiss(); } }.start(); stepTwo(); }
Y me gustaría asegurarme de que mi hilo esté completo antes de stepTwo (); se llama. ¿Cómo puedo hacer esto?
- Android: AsyncTask OR normal Java threads con ExecutorService
- Precisión del sueño del hilo
- Ejecutar el hilo de otro hilo
- AsyncTask.executeOnExecutor () antes de API Nivel 11
- RejectedExecutionException de AsyncTask, pero no han alcanzado los límites
¡Gracias!
- Inicio de un runnable en el hilo de fondo
- Lo que se mata con el hilo de la interfaz de usuario de Android
- Java / Android espera hasta que haya terminado un hilo antes de ejecutar un nuevo método
- Ejemplo de segmentación en Android
- Obtener hilo por nombre
- Espere a que los hilos se completen antes de continuar
- Llamada Hilo principal de hilo secundario en Java / Android
- ¿OnPreExecute () y onPostExecute () se ejecutan en el subproceso de interfaz de usuario o en el subproceso desde el que se inició AsyncTask?
La instancia Thread tiene un método join, así que:
private void onCreate() { final ProgressDialog dialog = ProgressDialog.show(this, "Please wait..", "Doing stuff..", true); Thread t = new Thread() { public void run() { //do some serious stuff... dialog.dismiss(); } }; t.start(); t.join(); stepTwo(); }
Es posible que desee probar esto sin embargo:
private void onCreate() { final ProgressDialog dialog = ProgressDialog.show(this, "Please wait..", "Doing stuff..", true); Thread t = new Thread() { public void run() { //do some serious stuff... SwingUtilities,invokeLater(new Runnable() { public void run() { dialog.dismiss(); } }); stepTwo(); } }; t.start(); }
Debido a que onCreate está en el subproceso de interfaz de usuario, tener la combinación de allí se congelará la interfaz de usuario hasta después de onCreate completa, guardando cualquier diálogo hasta entonces. stepTwo
tendrá que usar SwingUtilities.invokeLater
para realizar cualquier cambio de interfaz de usuario por sí mismo.
Si quieres ejecutar las cosas en segundo plano, te recomiendo que AsyncTask
clase AsyncTask
ya que así asegurarás que interactúas correctamente con el subproceso de interfaz de usuario.
Además, si desea que el código se ejecute después de completar la tarea de fondo, simplemente puede llamar al método. No hay ninguna razón para esperar dentro de onCreate()
.
Su código se verá así:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new MyAsyncTask().execute(); } private class MyAsyncTask extends AsyncTask<Void, Void, Void> { private ProgressDialog dialog; @Override protected void onPreExecute() { dialog = ProgressDialog.show(MyActivity.this, "Please wait..", "Doing stuff..", true); } @Override protected Void doInBackground(Void... params) { //do some serious stuff... return null; } @Override protected void onPostExecute(Void result) { dialog.dismiss(); stepTwo(); } }
Otra opción es simplemente mover step2()
en el subproceso para que se ejecute después de completar las tareas de subproceso:
private void onCreate() { final ProgressDialog dialog = ProgressDialog.show(this, "Please wait..", "Doing stuff..", true); new Thread() { public void run() { //do some serious stuff... dialog.dismiss(); stepTwo(); } }.start(); }
- ¿Puede explicar (cálculos matemáticos) ejemplo de gesto (Levenshtein)?
- Cómo manejar eventos de socket como servicio de fondo en Android?