40 votes

Appel du thread principal à partir du thread secondaire dans Android

Comment appeler le thread principal à partir du thread secondaire dans Android ?

82voto

thoredge Points 5829

La méthode la plus simple consiste à appeler runOnUiThread(...) à partir de votre thread.

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

24voto

Jesus Oliva Points 1443

Ma recommandation pour faire communiquer des threads dans un même processus est d'envoyer des messages entre ces threads. Il est très facile de gérer cette situation en utilisant des Handlers :

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

Exemple d'utilisation, de la documentation Android, à la gestion du travail coûteux hors du fil de l'interface utilisateur :

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
        [ . . . ]
    }
}

2voto

keyboardsurfer Points 7432

Vous aurez besoin d'un Handler qui renvoie l'information au fil principal.

1voto

Tad Points 98

De plus, il est bon de se rappeler que si vous obtenez votre thread secondaire par le biais d'une AsyncTask, vous avez la possibilité d'appeler onProgressUpdate() , onPostExecute() etc., pour effectuer des travaux sur le fil principal.

1voto

Ravindra babu Points 5571

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 poster un Message sur Handler de UI Thread, qui a été initialisé avec Looper de l'UI Thread.

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

  3. handleMessage processus Message reçu le MessageQueue et montre un Toast sur le fil de l'UI.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X