web-dev-qa-db-fra.com

Exécuter le rappel sur le thread principal

J'ai un code qui interagit avec le SDK Facebook Android, de manière asynchrone. Malheureusement, cela signifie qu’à son retour, il se trouve dans un fil d’arrière-plan.

Cocos-2dx préfère que j'interagisse avec elle dans le fil principal, en particulier lorsque vous exécutez des actions telles que demander au directeur de changer de scène (en ce qui concerne Open GL)

Est-il possible d’obtenir du code sur le thread principal?

22
James Campbell

Tant que vous avez un contexte, vous pouvez faire quelque chose comme ceci:

Handler mainHandler = new Handler(context.getMainLooper());

Et pour exécuter le code sur le thread d'interface utilisateur:

mainHandler.post(new Runnable() {

    @Override
    public void run() {
        // run code
    }
});

Comme suggéré par kaka :

Vous pouvez aussi utiliser static Looper.getMainLooper () qui

Renvoie le boucleur principal de l'application, qui réside dans le thread principal de l'application.

48
cYrixmorten
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        //execute code on main thread
    }
});
10
Lefteris

En C++:

Director::getInstance()->getScheduler()->performFunctionInCocosThread([]{
    // execute code on main thread
});
5
dimon4eg

Vous pouvez exécuter du code dans le thread principal de deux manières: (avec les lambdas de Java 8)

Si vous avez une instance d'activité:

activity.runOnUiThread(() -> {
     // do your work on main thread
});

Sinon, utilisez un objet Handler et publiez un Runnable. 

Vous pouvez utiliser la version postDelayed si vous avez besoin d'un peu de temps avant d'exécuter le code.

 Handler handler = new Handler(Looper.getMainLooper());
 handler.post(() -> {
     // do your work on main thread
 });
0
Domenico