web-dev-qa-db-fra.com

Android Débogage fileté Studio

J'ai eu du mal à déboguer une application multithread avec Android Studio 1.1. Il semble que lorsqu'un point d'arrêt est atteint, tous les autres threads s'arrêtent également, pas seulement celui avec le point d'arrêt. J'ai créé un application de test simple avec la méthode suivante dans onCreate de l'activité.

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

    Thread a = new Thread("thread-a") {
        @Override
        public void run() {
            Log.v("thread", "thread-a");
        }
    };

    Thread b = new Thread("thread-b") {
        @Override
        public void run() {
            Log.v("thread", "thread-b");
        }
    };

    a.start();
    b.start();
}

J'ai défini des points d'arrêt sur les lignes Log.v en thread-a et thread-b, puis je l'exécute en mode débogage sur mon Lollipop Nexus 5.

Lorsque l'application démarre, elle atteint le point d'arrêt dans le thread-a, mais le premier problème que je remarque est que l'interface utilisateur de l'application est vide comme si le thread principal était en pause. Ensuite, je suis allé voir que le point d'arrêt dans le thread-b est également atteint, donc j'affiche la vue Threads dans Android Débogueur de Studio, mais quand je vais développer la flèche du thread-b, il n'y a rien là-bas. Lorsque je développe le thread principal, il montre qu'il est suspendu quelque part dans onStart ().

Android Studio screenshot

Suis-je en train de faire quelque chose de mal ou ce débogueur est-il incapable de déboguer plusieurs threads à la fois?

40
miguel

Dans IntelliJ IDEA (et Android Studio est basé sur IntelliJ), lorsque vous placez un point d'arrêt, si vous faites un clic droit dessus, une boîte de dialogue s'affiche et vous peut choisir de suspendre tous les threads (par défaut) ou uniquement ce thread.

Vous suspendez tous les threads car il s'agit du paramètre par défaut.

53
Mister Smith

Dans Android Studio, il est possible de spécifier si un point d'arrêt donné suspendra l'exécution uniquement du thread d'exécution (qui déclenche le point d'arrêt) ou de tous les threads. Ceci est par point d'arrêt (c'est-à-dire certains les points d'arrêt peuvent suspendre tous les threads, tandis que d'autres ne suspendent que le thread actuel).

Cliquez avec le bouton droit sur un point d'arrêt pour afficher la fenêtre Propriétés du point d'arrêt:

Breakpoint properties

Notez l'option 'Make Default' qui permet de la définir par défaut pour tous les points d'arrêt nouvellement créés.

Si seul le thread actuel est suspendu (option "Thread" dans l'image ci-dessus), le cadre de pile des autres threads non suspendus ne sera pas visible dans la fenêtre Cadres:

Frames not available for unsuspended thread

24
CJBS