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?

¡Gracias!

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(); } 
  • ¿Cuál es la diferencia entre Handler, Runnable y Threads?
  • runOnUiThread no se está ejecutando en AsyncTask
  • Handler no entrega un mensaje o un Runnable al subproceso principal
  • Android: forma estándar de hacer correr un hilo cada segundo
  • Cómo esperar el inicio de un subproceso en java
  • Obtener las sugerencias de AutoCompleteTextView del servicio en un hilo independiente
  • Cómo reiniciar un hilo en Android?
  • Anotación Android para ejecutar en Ui Thread
  • El número de hilos activos sigue aumentando
  • Detener una ejecución en un hilo independiente
  • Cómo usar notificar y esperar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.