web-dev-qa-db-fra.com

Appelez le fil principal du fil secondaire dans Android

Comment appeler le fil principal à partir du fil secondaire sous Android?

39
sajjoo

Le moyen le plus simple est d'appeler runOnUiThread (...) à partir de votre thread.

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

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

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

Exemple d'utilisation, de la documentation Android, à la gestion de travaux coûteux à partir du fil d'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
        [ . . . ]
    }
}
23
Jesus Oliva

En outre, il est bon de se rappeler que si vous avez votre thread secondaire via une AsyncTask, vous avez la possibilité d’appeler onProgressUpdate () , onPostExecute () , etc, pour travailler sur le thread principal.

1
Tad

Vous aurez besoin d'une Handler qui renvoie les informations au thread principal.

1
keyboardsurfer

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 publie une Message sur Handler de thread d'UI, qui a été initialisé avec Looper de thread d'UI.

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

  3. handleMessage traite Message reçu le MessageQueue et affiche un Toast sur le fil de l'interface utilisateur.

1
Ravindra babu