在Java / Eclipse中,为什么在我的代码中设置断点会改变该语句的效果?

时间:2011-08-24 16:11:37

标签: java android eclipse breakpoints

我正在Eclipse中编写Android应用程序,并使用TextView在屏幕上显示一些文本。另一个线程有时会更改此视图的文本,使用以下代码:

runOnUiThread(new Runnable() {

    @Override
    public void run() {
        view.setText(newLyric);
    }
});

我想调试setText行以检查是否正在传入正确的字符串(对于某些文本,它不是自动换行以适应屏幕,而对于其他文本,但是这是一个不同的问题)。当我在该行上放置断点时,文本总是自动换行。当我禁用/删除断点时,通常不会被包装的文本(它是确定性的)不是自动换行的。

这对我来说没什么意义。我见过this question,我理解背后的原因,但我不明白为什么会出现这个问题。任何人都可以对此有所了解吗?我正在测试设备,如果这有任何区别。


编辑:事实证明这是竞争条件,现在我只需要弄清楚如何修复它......显然我只能选择一个'正确'的答案,但是谢谢你各位有用的评论:)

3 个答案:

答案 0 :(得分:5)

这样的事情有时/经常是竞争条件的标志。

设置断点可以消除竞争(因此,通过稍后运行覆盖该值的“流氓”线程现在可以在捕获断点时完成,作为示例)。

或者Heisenbug明确表示:)

答案 1 :(得分:2)

尝试为断点设置属性暂停VM 。默认行为是暂停正在运行的线程。如果你从其他线程中受到“污染”,这应该可以防止这种情况发生。

答案 2 :(得分:1)

由于您的代码在其自己的线程中运行,因此设置屏幕的代码(因此,决定或不执行自动换行)将在调用之前或之后运行,因为它在另一个线程中运行。

例如,在TextViews中,事件将触发并被OnEditorActionListener捕获。