Урок 84. Handler. Обработка Runnable

Обсуждение уроков
OrcSin
Сообщения: 8
Зарегистрирован: 18 дек 2014, 12:45

Re: Урок 84. Handler. Обработка Runnable

Сообщение OrcSin » 23 авг 2015, 22:48

Eduard,
updateProgress выполянется каждые 100 мс - TimeUnit.MILLISECONDS.sleep(100);
а инфо выводится у нас с задержкой в 1000 мс - h.postDelayed(showInfo, 1000);
То есть инфа выводится на каждый 10 раз, то есть с шагом в 10.

Аватара пользователя
Kirill
Сообщения: 19
Зарегистрирован: 09 сен 2015, 13:53

Re: Урок 84. Handler. Обработка Runnable

Сообщение Kirill » 16 сен 2015, 16:46

K_Vladimir писал(а):Доброго всем дня!
Подскажите, Бывают ли случаи когда сообщение отправляется из основного потока в новые потоки? А-то в уроках все время отправляли только в основной.
Дело в том, что Хендлер взаимодействует с очередью сообщений потока в котором он инициализирован, он умеет вставлять сообщения (другими словами задачи, Runnable) в очередь. А очередь сообщений присутствует у специальных потоков, так называемых Looper Thread. В этом потоке зацикленно выполнение задач из очереди, как например в Активити. MainActivity не заканчивается и не гаснет как раз из-за Looper.

Таким образом, чтобы повесить хендлер на отдельный поток, класс потока должен содержать Looper.
Для этого используется класс HandlerThread, можно отнаследоваться от него и потом как и для обычного потока вызвать myLooperThread.start()
или добавить в класс потока объект Looper

но перед тем как это делать, стоит обратить внимание на использование Сервисов, возможно они подойдут лучше.

vadym
Сообщения: 2
Зарегистрирован: 29 окт 2015, 17:51

Re: Урок 84. Handler. Обработка Runnable

Сообщение vadym » 24 ноя 2015, 22:29

Подскажите пожалуйста!
Я сделал цикл, который должен пройти 9 итераций, а в итоге проходит только 1. Вроде бы всё правильно подключил, но что-то не выходит. mCarousel.test() - это вызов метода, который выводит данные на экран.

Runnable runnable = new Runnable() {
public void run() {

int c = 0, ticks = 0;
long start_time = System.nanoTime();
float tick = 0f, time = 2f;

while (c < 9) {
float delta = (System.nanoTime() - start_time) / 1000000000.0f * 100;
start_time = System.nanoTime();
//Log.d("lt", "d: " + delta);
tick += delta;
ticks++;
if (tick > time) {
tick = 0;
Log.d("lt", "ticks: " + ticks);
ticks = 0;
mCarousel.test();
c++;
}

}
}
};
Thread thread = new Thread(runnable);
thread.start();
}

Night_Scream
Сообщения: 54
Зарегистрирован: 23 сен 2013, 10:51

Re: Урок 84. Handler. Обработка Runnable

Сообщение Night_Scream » 25 ноя 2015, 09:53

vadym писал(а):Подскажите пожалуйста!
Я сделал цикл, который должен пройти 9 итераций, а в итоге проходит только 1. Вроде бы всё правильно подключил, но что-то не выходит. mCarousel.test() - это вызов метода, который выводит данные на экран.

Runnable runnable = new Runnable() {
public void run() {

int c = 0, ticks = 0;
long start_time = System.nanoTime();
float tick = 0f, time = 2f;

while (c < 9) {
float delta = (System.nanoTime() - start_time) / 1000000000.0f * 100;
start_time = System.nanoTime();
//Log.d("lt", "d: " + delta);
tick += delta;
ticks++;
if (tick > time) {
tick = 0;
Log.d("lt", "ticks: " + ticks);
ticks = 0;
mCarousel.test();
c++;
}

}
}
};
Thread thread = new Thread(runnable);
thread.start();
}
Ну так расставьте логи и посмотрите где останавливается. Задача то тривиальная

Ответить