2012-01-01 6 views
7

Mi aplicación para Android emplea un cálculo particularmente grande que sigue bloqueando el sistema porque está en el hilo de UI en la Actividad. Tengo poca confianza en el multihilo y por eso quiero obtener algunos consejos sobre cómo hacerlo correctamente. Esto es lo que tengoTomando computación pesada del Android UI Thread

class ActivtyName extends Activity{ 
boolean threadcomplete = false; 

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
//stuff 

Runnable newthread = new Runnable(){ 

      @Override 
      public void run() { 
       doBigComputation(); 
       threadcomplete=true; 
      } 

     }; 

     newthread.run(); 

     boolean b = true; 
     while(b){ 
      if(threadcomplete){ 
       b=false; 
       startTheApp(); 
      } 
     } 

} 
} 

Ahora, estoy bastante seguro de lo que he hecho no es "correcta". (Parece que funciona, sin embargo, el sistema no falla). Básicamente, no estoy seguro de cómo se puede decir a la cadena de interfaz de usuario que newthread ha terminado el cálculo sin este booleano, threadcomplete. ¿Hay una forma "correcta" de hacer esto?

+0

echar un vistazo en AsyncTask, http://developer.android.com/reference/android/os/AsyncTask.html –

Respuesta

12

Solo para ampliar un poco el comentario de Marek Sebera, este es el marco de trabajo sobre cómo lograr eso en una AsyncTask.

private class BigComputationTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
    // Runs on UI thread 
    Log.d(TAG, "About to start..."); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
    // Runs on the background thread 
    doBigComputation(); 
    } 

    @Override 
    protected void onPostExecute(Void res) { 
    // Runs on the UI thread 
    Log.d(TAG, "Big computation finished"); 
    startTheApp(); 
    } 

} 

Y llamarlo:

BigComputationTask t = new BigComputationTask(); 
t.execute(); 
-2

Cuando quiero usar hilos, tengo casi un gran ciclo. Puse una condición booleana que siempre es cierta, excepto cuando quiero detenerla.

Uso Thread (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html) y vuelvo a implementar el método de detención porque está en desuso. Entonces en mi método de detención puedo poner un valor falso a la variable de ciclo.

Para terminar el hilo, uso t.stop(). Entonces puedes di eso en tu actividad.

Si desea saber cuándo se detiene un Thead, puede usar t.isAlive(). Si el hilo t se inicia, isAlive devolverá verdadero.

1

Esa no es la forma correcta de iniciar un hilo. Que tiene que hacer:

Runnable newthread = new Runnable(){ 

     @Override 
     public void run() { 
      doBigComputation(); 
      threadcomplete=true; 
     } 

    }; 

    Thread t = new Thread(newthread); 
    newthread.start(); 

    boolean b = true; 
    while(b){ 
     if(threadcomplete){ 
      b=false; 
      startTheApp(); 
     } 
    } 
+2

Utilice una unión que esperar a que el hilo, no lo hace ocupada espera como lo estás haciendo. http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html – odiggity