Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 18

Как правильно составить цикл который выполняет каждую команду с разной паузой - Android

29.08.2015, 20:02. Показов 907. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно при нажатии кнопки, допустим button1 и button2 выполнять следующее:
При нажатии на button1
Отправлять следующие команды:
Java
1
2
3
4
5
6
7
8
9
10
11
addCRC(new byte[]{1, 0x5, 11, 5 ,0, 0});    //10 сек
addCRC(new byte[]{1, 0x5, 11, 1 ,0, 0});    //0 сек
addCRC(new byte[]{1, 0x5, 0, 5 ,0, 0});      //30 сек
addCRC(new byte[]{1, 0x5, 1, 5 ,0, 0});      //5 сек
addCRC(new byte[]{1, 0x5, 2, 5 ,0, 0});      //5 сек
addCRC(new byte[]{1, 0x5, 3, 5 ,0, 0});      //5 сек
addCRC(new byte[]{1, 0x5, 4, 5 ,0, 0});      //5 сек
addCRC(new byte[]{1, 0x5, 5, 5 ,0, 0});      //5 сек
addCRC(new byte[]{1, 0x5, 6, 5 ,0, 0});      //5 сек
addCRC(new byte[]{1, 0x5, 7, 5 ,0, 0});      //5 сек
addCRC(new byte[]{1, 0x5, 8, 5 ,0, 0});      //5 сек
А при нажатии на кнопку button2 должны отправятся вот эти команды только в обратном порядке
Java
1
2
3
4
5
6
7
8
9
addCRC(new byte[]{1, 0x5, 0, 1 ,0, 0});    
addCRC(new byte[]{1, 0x5, 1, 1 ,0, 0});    //5сек
addCRC(new byte[]{1, 0x5, 2, 1 ,0, 0});    //5сек
addCRC(new byte[]{1, 0x5, 3, 1 ,0, 0});    //5сек
addCRC(new byte[]{1, 0x5, 4, 1 ,0, 0});    //5сек
addCRC(new byte[]{1, 0x5, 5, 1 ,0, 0});    //5сек
addCRC(new byte[]{1, 0x5, 6, 1 ,0, 0});    //5сек
addCRC(new byte[]{1, 0x5, 7, 1 ,0, 0});    //5сек
addCRC(new byte[]{1, 0x5, 8, 1 ,0, 0});    //5сек
С 9 по 1 с задержками

Вот рабочий пример при нажатии на кнопку который отправляет одну команду:
Java
1
2
bytesToSend = addCRC(new byte[]{0x1, 0x3, 0x0, 0x0 ,0x0, 0x0});
mPhysicaloid.write(bytesToSend, bytesToSend.length);
Как мне через
Java
1
mPhysicaloid.write
отправлять команды с задержкой после каждой команды (Время задержки указаны в комментариях) ?

И как можно это все красиво переделать чтобы не получался такой громоздкий и тупой код ?

Я думаю что это должно быть как то так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public byte[] MyListComands = new byte[11];
 
public void onClickWrite(View v) { 
    new Thread() {
        @Override
        public void run() {
            int TimeOut = 0;
            try {
                for (int i = 0; i <= 11;  i++, Thread.sleep(TimeOut)) {
                    MyListComands[i] = addCRC(new byte[]{1, 0x5, 1, 5 ,0, 0});
                    // Тут как я догоняю должно быть то - что в зависимости от значение "i"
                    // будет присваивать новое значение таймеру TimeOut
                    mPhysicaloid.write(MyListComands[i], MyListComands[i].length);
                }
            } catch (InterruptedException ex) {
            // тут хз что ;(
            }
        }
 
    }.start();
}
Но эта работать не будет, но как же все таки это сделать ?

Хотя есть чувство что должно быть так:
Java
1
public byte[][] MyListComands = new byte[11][8];
, а не так как сейчас
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.08.2015, 20:02
Ответы с готовыми решениями:

Как сделать цикл, который повторяется каждую секунду на форме?
Как сделать цикл, который повторяется каждую секунду и что бы останавливался сам цикл, а не программа на 1 секунду

цикл который выполняет функцию <select>
Мне нужно сделать select из 4 слов как в html &lt;select&gt; &lt;?php $select1=array('Да, конечно','Возможно','Нет','Не...

Цикл с паузой
Как сделать например цикл FOR так чтобы следующий шаг начинался только после нажатия кнопки? Оо

4
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
29.08.2015, 20:35
Takt!k, можно через Handler#postDelayed.
0
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 18
29.08.2015, 20:41  [ТС]
Цитата Сообщение от YuraAAA Посмотреть сообщение
Takt!k, можно через Handler#postDelayed.
Handler уже используется в MainActivity он как раз принимает ответы
Вот его код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
    Handler mHandler = new Handler();
 
    private void tvAppend(TextView tv, CharSequence text) {
        final TextView ftv = tv;
        final CharSequence ftext = text;
        mHandler.post(new Runnable() {
            @Override
            public void run() {
 
                ftv.append(ftext);
            }
        });
    }
0
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
29.08.2015, 21:39
Takt!k, если я правильно понял, то:
1. Создаём класс-обёртку для byte[] и delay (я его сделал внутренним):

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
private class Data {
        private byte[] data;
        private long delay;
 
        private Data(byte[] data, long delay) {
            this.data = data;
            this.delay = delay;
        }
 
        private long toMS() {
            return delay * 1000l;
        }
    }
2. Создаём коллекцию таких данных, и парочку переменных
Java
1
2
private ArrayList<Data> data = new ArrayList<>();
    private int currentIndex;
3. Метод заполнения:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void populateCollection() {
        data.add(new Data(new byte[]{1, 0x5, 11, 5, 0, 0}, 10L));
        data.add(new Data(new byte[]{1, 0x5, 11, 1, 0, 0}, 0L));    //0 сек
        data.add(new Data(new byte[]{1, 0x5, 0, 5, 0, 0}, 30L));      //30 сек
        data.add(new Data(new byte[]{1, 0x5, 1, 5, 0, 0}, 5L));      //5 сек
        data.add(new Data(new byte[]{1, 0x5, 2, 5, 0, 0}, 5L));      //5 сек
        data.add(new Data(new byte[]{1, 0x5, 3, 5, 0, 0}, 5L));            //5 сек
        data.add(new Data(new byte[]{1, 0x5, 4, 5, 0, 0}, 5L));      //5 сек
        data.add(new Data(new byte[]{1, 0x5, 5, 5, 0, 0}, 5L));            //5 сек
        data.add(new Data(new byte[]{1, 0x5, 6, 5, 0, 0}, 5L));            //5 сек
        data.add(new Data(new byte[]{1, 0x5, 7, 5, 0, 0}, 5L));            //5 сек
        data.add(new Data(new byte[]{1, 0x5, 8, 5, 0, 0}, 5L));            //5 сек
 
    }
Ну и то, что будет нам печатать:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public void start(final boolean reverse) {
        //Проверяем инциализацию коллекции
        if (data.isEmpty()) {
            //Пусть начальный элемент 0
            currentIndex = 0;
            //Но если идём в обратную сторону - последний
            if (reverse) currentIndex = data.size() - 1;
            //Заполняем коллекцию
            populateCollection();
        }
        //Запускаем хэндлер. Если в обратную сторону, то delay из последнего элемента, если нет - то из первого
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //Текущий элемент. При первом прямом проходе он будет нулевой
                Data currentData = data.get(currentIndex);
                //Send!
                addCRC(currentData.data);
                //Если идём в обратную сторону - уменьшаем на 1, иначе увеличиваем
                if (reverse) {
                    currentIndex--;
                } else {
                    currentIndex++;
                }
                //Если дошли до конца или до начала - очищаем коллекцию
                if ((reverse && currentIndex == -1) || (!reverse && currentIndex == data.size())) {
                    data.clear();
                    return;
                }
                //Иначе перезапускаем себя же.
                new Handler().postDelayed(this, data.get(currentIndex).delay);
 
 
            }
        }, reverse ? data.get(0).toMS() : data.get(data.size() - 1).toMS());
    }
Вот весь класс:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import android.os.Handler;
 
import java.util.ArrayList;
 
public class DelayedPrinter {
 
    private ArrayList<Data> data = new ArrayList<>();
    private int currentIndex;
 
    private void populateCollection() {
        data.add(new Data(new byte[]{1, 0x5, 11, 5, 0, 0}, 10L));
        data.add(new Data(new byte[]{1, 0x5, 11, 1, 0, 0}, 0L));    //0 сек
        data.add(new Data(new byte[]{1, 0x5, 0, 5, 0, 0}, 30L));      //30 сек
        data.add(new Data(new byte[]{1, 0x5, 1, 5, 0, 0}, 5L));      //5 сек
        data.add(new Data(new byte[]{1, 0x5, 2, 5, 0, 0}, 5L));      //5 сек
        data.add(new Data(new byte[]{1, 0x5, 3, 5, 0, 0}, 5L));            //5 сек
        data.add(new Data(new byte[]{1, 0x5, 4, 5, 0, 0}, 5L));      //5 сек
        data.add(new Data(new byte[]{1, 0x5, 5, 5, 0, 0}, 5L));            //5 сек
        data.add(new Data(new byte[]{1, 0x5, 6, 5, 0, 0}, 5L));            //5 сек
        data.add(new Data(new byte[]{1, 0x5, 7, 5, 0, 0}, 5L));            //5 сек
        data.add(new Data(new byte[]{1, 0x5, 8, 5, 0, 0}, 5L));            //5 сек
 
    }
 
    public void start(final boolean reverse) {
        //Проверяем инциализацию коллекции
        if (data.isEmpty()) {
            //Пусть начальный элемент 0
            currentIndex = 0;
            //Но если идём в обратную сторону - последний
            if (reverse) currentIndex = data.size() - 1;
            //Заполняем коллекцию
            populateCollection();
        }
        //Запускаем хэндлер. Если в обратную сторону, то delay из последнего элемента, если нет - то из первого
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //Текущий элемент. При первом прямом проходе он будет нулевой
                Data currentData = data.get(currentIndex);
                //Send!
                addCRC(currentData.data);
                //Если идём в обратную сторону - уменьшаем на 1, иначе увеличиваем
                if (reverse) {
                    currentIndex--;
                } else {
                    currentIndex++;
                }
                //Если дошли до конца или до начала - очищаем коллекцию
                if ((reverse && currentIndex == -1) || (!reverse && currentIndex == data.size())) {
                    data.clear();
                    return;
                }
                //Иначе перезапускаем себя же.
                new Handler().postDelayed(this, data.get(currentIndex).delay);
 
 
            }
        }, reverse ? data.get(0).toMS() : data.get(data.size() - 1).toMS());
    }
 
 
    private class Data {
        private byte[] data;
        private long delay;
 
        private Data(byte[] data, long delay) {
            this.data = data;
            this.delay = delay;
        }
 
        private long toMS() {
            return delay * 1000l;
        }
    }
 
}
Добавлено через 23 минуты
Цитата Сообщение от YuraAAA Посмотреть сообщение
//Иначе перезапускаем себя же.
* * * * * * * * new Handler().postDelayed(this, data.get(currentIndex).delay);
ошибка тут, вместо delay надо toMS();
0
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 18
29.08.2015, 22:36  [ТС]
Цитата Сообщение от YuraAAA Посмотреть сообщение
....Выше..........
Я конечно сразу извиняюсь за тупые вопросы:
1) Если у меня в коде еже есть один Handler который получает как-раз ответы от контролера которые посылает mPhysicaloid.write, будет ли нормальным использовать еще один Handler в коде?
2) Если все-же данный метод мне полностью подходит, можно ли сделать так чтобы в обратном порядке он выключал только те которые мне нужны
Так как в моем примере (вопросе) на button1 есть первые две команды которые которые исключены из button2


Java
1
private ArrayList<Data> data = new ArrayList<>();
Здесь точно так, или так:
Java
1
private ArrayList<Data> data = new ArrayList<Data>();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.08.2015, 22:36
Помогаю со студенческими работами здесь

Цикл с паузой
Вопрос простой до невозможности, но сколько бы я не искал его на английских форумах, на русских - нигде не нашел ответа. Как сделать...

Составить команду из четырех лучших спортсменов для участия в эстафете 4x100; (через цикл for)
Задан список участников соревнований по фигурному катанию на коньках и их результаты. Расположить порядковые номера участников и результаты...

нужно описать программу. т.е. каждую команду и каждую группу нужно расписать. подсобите пожалуйста
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; #define K_TO_M 0.6214 #define M_TO_K 1.6093 int main() { int k;...

System не выполняет команду
Почему функция system не выполняет эту команду? system(&quot;ipconfig /release&quot;);

Как можно узнать логин юзера, который выполнЯет запрос?
Можно ли узнать логин юзера, который выполняет в данный момент запрос р занести переменную? Т. Е вот я включил запрос и мой логин заносится...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru