2012-01-01 11 views
7

La mia app per Android utilizza un calcolo particolarmente grande che continua a bloccare il sistema perché si trova sul thread dell'interfaccia utente nell'attività. Ho poca fiducia nel multithreading e quindi voglio avere qualche consiglio su come farlo correttamente. Questo è ciò che hoPrendendo il calcolo pesante dal thread dell'interfaccia utente Android

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(); 
      } 
     } 

} 
} 

Ora, io sono abbastanza sicuro quello che ho fatto non è "corretto". (Sembra funzionare comunque. Il sistema non si blocca). Fondamentalmente, non sono sicuro di come il thread dell'interfaccia utente possa essere detto che newthread ha terminato il calcolo senza questo booleano, thread-completo. Esiste un modo "corretto" per farlo?

+0

dare uno sguardo su AsyncTask, http://developer.android.com/reference/android/os/AsyncTask.html –

risposta

12

Giusto per espandere un po 'il commento di Marek Sebera, ecco il quadro su come lo si potrebbe ottenere in un 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(); 
    } 

} 

E chiamarlo:

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

Quando voglio utilizzare i thread, ho un ciclo piuttosto lungo. Ho messo una condizione booleana che è sempre vera, tranne quando voglio fermarlo.

Io uso Thread (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html) e reimplemento il metodo stop perché è deprecato. Quindi nel mio metodo stop posso inserire un valore falso nella variabile loop.

Per terminare il thread, utilizzo t.stop(). Quindi puoi farlo nella tua attività.

Se si desidera sapere quando si interrompe un Thead, è possibile utilizzare t.isAlive(). Se il thread t viene avviato, isAlive restituirà true.

1

Questo non è il modo corretto di iniziare una discussione. Hai bisogno di fare:

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

Utilizzare un join di aspettare il filo, non lo fai occupato aspetta come stai facendo http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html – odiggity

Problemi correlati