В Java / Eclipse, почему установка точки останова в моем коде изменяет эффект этого оператора? - PullRequest
4 голосов
/ 24 августа 2011

Я пишу приложение для Android в Eclipse и отображаю текст на экране, используя TextView.Другой поток иногда изменяет текст этого представления следующим кодом:

runOnUiThread(new Runnable() {

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

Я хотел отладить строку setText, чтобы проверить, что передается правильная строка (как для некоторого текста,это не было завернуто в слова, чтобы соответствовать экрану, и для другого текста это было, но это другая проблема).Когда я ставлю точку останова в этой строке, текст всегда завернутый в слова.И когда я отключаю / удаляю точку останова, текст, который обычно не переносится словами (он детерминирован), не переносится словами.

Это не имеет большого смысла для меня.Я видел этот вопрос , и я понимаю причину, стоящую за этим, но я не понимаю, почему это будет проблемой здесь.Может кто-нибудь пролить некоторый свет на это?Я тестирую на устройстве, если это что-то меняет.


Редактировать: Оказывается, это было состояние гонки, теперь мне просто нужно разобраться, как исправитьэто ... Очевидно, я мог выбрать только один «правильный» ответ, но спасибо всем вам за полезные комментарии:)

Ответы [ 3 ]

5 голосов
/ 24 августа 2011

Подобные вещи иногда / часто являются признаком состояния гонки.

Установка точки останова исключает гонку (так что поток «мошенников», который переопределял значение при запуске позже, теперь завершается к тому времени, когда ваша точка останова перехватывается, например).

Или это явный случай Гейзенбаг :)

2 голосов
/ 24 августа 2011

Попробуйте установить свойство Остановить ВМ для вашей точки останова. Поведение по умолчанию - просто остановить работающий поток. Если вы получаете «загрязнение» от других потоков, это должно остановить это.

1 голос
/ 24 августа 2011

Возможно, поскольку ваш код выполняется в своем собственном потоке, код, который настраивает экран (и, следовательно, решает или не переносит слова), будет выполняться до или после вашего вызова, поскольку он выполняется в другом потоке.

Например, в TextViews события будут срабатывать и перехватываться OnEditorActionListener .

...