1

Привет. Есть код:

    ReadDataBut = (Button) view.findViewById(R.id.button12);
    ReadDataBut.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            clickedButton = v.getId();

            for (int i=0; i<packetIntervals.length; i++)
            {

                readPacket[9] = (byte)(packetIntervals[i] & 0xFF);
                readPacket[10] = (byte)((packetIntervals[i] >> 8) & 0xFF);

                readPacket[readPacket.length - 1] = (byte)((getLRC(readPacket) >> 8) & 0xFF);
                readPacket[readPacket.length - 2] = (byte)(getLRC(readPacket) & 0xFF);

                ftDev.write(readPacket, readPacket.length);

                try {
                    Thread.sleep(2500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // посылка пришла
                answ_buff_cnt = 0;

                progressBar.setProgress(30);

            }

        }
    });

Строка progressBar.setProgress(30); выполняется после прогона всего цикла, т.е. в конце обработчика события, а мне надо, чтобы она выполнялась тут же, как встречается. Т.е. в конце обрабатывается именно метод объекта progressBar. Каковы причины этого и как это обойти? Платформа - android.

1
  • Выполняется progressBar.setProgress(30); именно как только встречается, но отображаются изменения, как только заканчивает выполняться ваш код. То есть после выполнения цикла. 20 сен 2014 в 7:20

1 ответ 1

1

Причина простая - Вы используете Thread.sleep(2500); в главном потоке. А он для этого не предназначен. Просто примите тот факт, что нельзя использовать слип в главном потоке.

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

sleep полностью останавливает все выполнение в потоке. Соответственно, все задачи в очереди ждут. В том числе и задача отрисовки. (Там может быть и несколько задач на отрисовку - к примеру, нарисовать 1 процент, 2, 3, но они либо быстро проходят все, либо просто рисуется последнее, так как рисовать смысл предыдущие нет.)

Что делать?
Самый обычный способ, который подскажут, - делать потоки. Это хороший и универсальный способ. Тем более, что здесь чтение.

Еще один способ, который в этом случае подойдет, - это AsyncTask. Он работает в отдельном потоке, и подобных проблем не будет. А если нужно обновить интерфейс - там есть специальное событие. Начните чтение с этого.

1
  • Спасибо! Посмотрю.
    – olegall
    19 сен 2014 в 9:26

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.