Java / Android espera hasta que haya terminado un hilo antes de ejecutar un nuevo método

Tengo una aplicación androide (escrita en java) que tiene dos botones ( conectar y solicitar datos ).

Cuando se hace clic en cada botón, se realiza una tarea y aparece un cuadro de diálogo de progreso para mostrar cuánto ha terminado la tarea.

Para mostrar el diálogo de progreso, cuando se hace clic en cada botón, la tarea se ejecuta en un subproceso.

El botón de conexión sólo tiene una tarea: ejecutar en el hilo. Sin embargo, el botón de datos de solicitud ejecuta dos tareas: la primera tarea del subproceso similar al botón de conexión, pero también una segunda tarea, refreshInfo () que se debe ejecutar después de la primera tarea del subproceso, progThread ha finalizado.

private Button connectButton; private Button requestDataButton; private ProgressDialog connectionDialog; private ProgressDialog requestDataDialog; private ProgressThread progThread; private int currentDialog; public void connectClick(View view) //When the connect button is clicked { performAction(1); //Run the thread to perform the action } public void requestDownloadClick(View view) //When the request data button is clicked { performAction(2); //Run the thread to perform the action refreshInfo(); //Do something else } private void performAction(int type) { currentDialog = type; showDialog(type); try { progThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } 

El método clave aquí es performAction (tipo int) . Básicamente, no quiero que este método se complete hasta que progThread ha terminado de ejecutarse.

Como se puede ver, he intentado progThread.join () para evitar que el método continúe hasta que progThread ha terminado de ejecutarse, sin embargo, como progThread implica mostrar un diálogo de progreso , ejecutar progThread.join () parece impedir que el diálogo de progreso de mostrar, como actualmente cuando hace clic en el botón, la primera tarea está realizando pero el cuadro de diálogo sólo parpadea al final.

¿Puede alguien pensar en una forma de ejecutar el hilo, mostrando el diálogo de progreso como normal y luego ejecutar el segundo método (si existe).

He incluido el código del hilo abajo, en caso de que sea necesario.

 private class ProgressThread extends Thread { final static int DONE = 0; final static int RUNNING = 1; // Class constants defining state of the thread private Handler progressHandler; int mState; int total; ProgressThread(Handler _handler) // Constructor with an argument that specifies Handler on main thread to which messages will be sent by this thread. { progressHandler = _handler; } public void run() // Invoked automatically when the Thread starts. { mState = RUNNING; updateProgressBar(); connectButton = (Button) findViewById(R.id.btnConnect); requestDataButton = (Button) findViewById(R.id.btnRequestDownload); while (mState == RUNNING) { if (currentDialog == 1) { try { doSomething(); if (something) { setState(DONE); total = 100; updateProgressBar(); removeDialog(1); connectButton.setEnabled(false); } else { total = total + 20; if (something has reached a limit) { setState(DONE); total = 0; updateProgressBar(); removeDialog(1); } } updateProgressBar(); } catch (Exception e) { } } if (currentDialog == 2) { try { doSomething(); total = 10; updateProgressBar(); doSomething(); total = 70; updateProgressBar(); if (something) //If the download info has not been got { setState(DONE); total = 0; updateProgressBar(); removeDialog(2); runOnUiThread(new Runnable() { public void run() { connectButton.setEnabled(true); requestDataButton.setEnabled(true); } }); } else { total = 100; updateProgressBar(); setState(DONE); removeDialog(2); runOnUiThread(new Runnable() { public void run() { requestDataButton.setEnabled(false); } }); } } catch (Exception e) { removeDialog(2); setState(DONE); runOnUiThread(new Runnable() { public void run() { connectButton.setEnabled(true); requestDataButton.setEnabled(true); } }); } } } } // Set current state of thread (use state=ProgressThread.DONE to stop thread) public void setState(int state) { mState = state; } public void updateProgressBar() { Message msg = progressHandler.obtainMessage(); // Send message (with current value of total as data) to Handler on UI thread so that it can update the progress bar Bundle b = new Bundle(); b.putInt("total", total); msg.setData(b); progressHandler.sendMessage(msg); } } final Handler handler = new Handler() // Handler on the main (UI) thread that will receive messages from the second thread and update the progress. { public void handleMessage(Message msg) { int total = msg.getData().getInt("total"); // Get the current value of the variable total from the message data and update the progress bar switch (currentDialog) { case 1 : connectionDialog.setProgress(total); break; case 2 : requestDataDialog.setProgress(total); break; } } }; protected Dialog onCreateDialog(int id) { switch (currentDialog) { case 1 : connectionDialog = new ProgressDialog(this); connectionDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); connectionDialog.setMax(100); connectionDialog.setProgress(0); connectionDialog.setMessage("Connecting To The Device"); progThread = new ProgressThread(handler); progThread.start(); return connectionDialog; case 2 : requestDataDialog = new ProgressDialog(this); requestDataDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); requestDataDialog.setMax(100); requestDataDialog.setProgress(0); requestDataDialog.setMessage("Requesting Download Data"); progThread = new ProgressThread(handler); progThread.start(); return requestDataDialog; default : return null; } } 

4 Solutions collect form web for “Java / Android espera hasta que haya terminado un hilo antes de ejecutar un nuevo método”

La API de Android proporciona una clase AsyncTask que tiene dos métodos doInBackground y onPostExecute . Tendrá que anular ambos, hacer lo que tenga que hacer en doInBackground y cuando el trabajo se realiza onPostExecute callback se ejecutará. También hay una onProgressUpdate llamada onProgressUpdate que es exactamente lo que necesita.

Observe la clase AsyncTask. Debe ser capaz de hacer lo que quiera.

http://developer.android.com/reference/android/os/AsyncTask.html

Parece que otras respuestas te han cubierto. AsyncTask es el camino a seguir.

Sin embargo, si desea avanzar con su implementación de subprocesos, sólo start() el siguiente subproceso al final del método de ejecución del primer subproceso.

Suena como usted necesita utilizar un CountdownLatch de tamaño 1

  • Número de impacto del Servicio en la eficiencia de la aplicación
  • ¿Los hilos se eliminan automáticamente después de que el método run () sale en Java?
  • Pasar un mensaje del hilo a la interfaz de usuario de actualización
  • Runnable se publica correctamente pero no se ejecuta
  • Cómo reiniciar un hilo en Android?
  • Espere a que los hilos se completen antes de continuar
  • Espere un hilo antes de continuar en Android
  • Android: forma correcta de pasar un mensaje de hilo de fondo a hilo de interfaz de usuario?
  • Inicio de un runnable en el hilo de fondo
  • Cómo pausar / reanudar el hilo en Android?
  • Valor devuelto del hilo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.