2010-12-08 8 views

Répondre

72

La façon la plus simple est d'appeler runOnUiThread (...) à partir de votre fil

activity.runOnUiThread(new Runnable() { 
    public void run() { 
     ... do your GUI stuff 
    } 
}); 
+1

qu'en est-il de via java? – jonney

+3

Que voulez-vous dire par «via Java»? Ceci est Java – thoredge

+0

je veux dire par j2se standard java pas android – jonney

22

Ma recommandation de communiquer des threads dans le même processus est l'envoi de messages entre ces threads. Il est très facile de gérer cette situation en utilisant Handlers:

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

Exemple d'utilisation, de la documentation Android, à la manipulation coûteux travail hors du fil ui:

public class MyActivity extends Activity { 

    [ . . . ] 
    // Need handler for callbacks to the UI thread 
    final Handler mHandler = new Handler(); 

    // Create runnable for posting 
    final Runnable mUpdateResults = new Runnable() { 
     public void run() { 
      updateResultsInUi(); 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     [ . . . ] 
    } 

    protected void startLongRunningOperation() { 

     // Fire off a thread to do some work that we shouldn't do directly in the UI thread 
     Thread t = new Thread() { 
      public void run() { 
       mResults = doSomethingExpensive(); 
       mHandler.post(mUpdateResults); 
      } 
     }; 
     t.start(); 
    } 

    private void updateResultsInUi() { 

     // Back in the UI thread -- update our UI elements based on the data in mResults 
     [ . . . ] 
    } 
} 
+0

Merci! Fonctionne comme un charme !! : D –

1

Vous aurez besoin d'un Handler qui transmet les informations au thread principal.

1

En outre, il est bon de se rappeler que si vous obtenez votre fil secondaire à travers un AsyncTask, vous avez la possibilité d'appeler onProgressUpdate() , onPostExecute(), etc., pour travailler sur le fil principal.

0

Exemple de code utilisant HandlerThread

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final Handler responseHandler = new Handler(Looper.getMainLooper()){ 
      @Override 
      public void handleMessage(Message msg) { 
       //txtView.setText((String) msg.obj); 
       Toast.makeText(MainActivity.this, 
         "Result from UIHandlerThread:"+(int)msg.obj, 
         Toast.LENGTH_LONG) 
         .show(); 
      } 
     }; 

     HandlerThread handlerThread = new HandlerThread("UIHandlerThread"){ 
      public void run(){ 
       /* Add your business logic to pupulate attributes in Message 
        in place of sending Integer 5 as in example code */ 
       Integer a = 5; 
       Message msg = new Message(); 
       msg.obj = a; 
       responseHandler.sendMessage(msg); 
       System.out.println(a); 
      } 
     }; 
     handlerThread.start(); 

    } 

} 

Explication:

  1. Dans l'exemple ci-dessus, HandlerThread afficher un Message sur Handler de l'interface utilisateur de cette discussion, qui a été initialisé avec Looper de l'interface utilisateur fil.

    final Handler responseHandler = new Handler(Looper.getMainLooper()) 
    
  2. responseHandler.sendMessage(msg); envoie Message de HandlerThread à l'interface utilisateur Discussion Handler.

  3. handleMessage processus Message reçus sur MessageQueue et affiche un Toast sur le thread UI.