Android Studio 1.1でマルチスレッドアプリのデバッグに問題があります。ブレークポイントにヒットすると、ブレークポイントを持つスレッドだけでなく、他のすべてのスレッドも停止するようです。アクティビティのonCreateで次のメソッドを使用した簡単なテストアプリ。
@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();
}
Thread-aとthread-bのLog.v行にブレークポイントを設定し、Lollipop Nexus 5でデバッグモードで実行します。
アプリが起動すると、thread-aのブレークポイントにヒットしますが、最初の問題は、メインスレッドが一時停止されているかのようにアプリのUIが空白になることです。次に、thread-bのブレークポイントもヒットすることを確認しました。そのため、Android Studioのデバッガーで[スレッド]ビューを表示しますが、thread-b矢印を展開すると、何も表示されません。メインスレッドを展開すると、onStart()のどこかで一時停止していることがわかります。
私は何か間違ったことをしているのですか、このデバッガは一度に複数のスレッドをデバッグできませんか?
IntelliJでは、IDEA(およびAndroid StudioはIntelliJに基づいています)、ブレークポイントを配置するときに、ブレークポイントを右クリックするとダイアログが表示され、すべてのスレッドを一時停止する(デフォルト)か、そのスレッドのみを一時停止するかを選択できます。
これはデフォルト設定であるため、すべてのスレッドを一時停止しています。
Android Studioでは、特定のブレークポイントが実行中のスレッド(ブレークポイントをトリガーする)のみの実行を中断するか、すべてのスレッドを中断するかを指定できます。これはブレークポイントごと(つまり、ブレークポイントはすべてのスレッドを中断できますが、他のスレッドは現在のスレッドのみを中断できます。
ブレークポイントを右クリックして、[ブレークポイントのプロパティ]ウィンドウを表示します。
[デフォルトにする]オプションに注意してください。これにより、新しく作成されたすべてのブレークポイントに対してこれをデフォルトにすることができます。
現在のスレッドのみが中断されている場合(上の図のオプション「スレッド」)、中断されていない他のスレッドのスタックフレームは、フレームウィンドウに表示されません。