Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71

Вызывать последовательно методы или потоки

09.09.2016, 03:06. Показов 1668. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что то устал бороться с асинхронностью Явы. Например строки 6-7 выполняются после цикла 15-17, а активация кнопки и фона происходят сразу при вызове метода.
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
 public void Learn() {
        for (int x = 0; x < 5; x++){
            timetaske2 = new TimeTaskE2();
            timetaske2.execute();
            try {
                timetaskje = new TimeTaskJe();
                timetaskje.execute();
                
                TimeUnit.MILLISECONDS.sleep(10 * durationDot);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
 
        for (int x = 0; x < 5; x++){
            timetaskl2 = new TimeTaskL2();
            timetaskl2.execute();
        }
   
        Button btEnter = ((Button) findViewById(R.id.start)); // активируем кнопку
        btEnter.setText("СТАРТ");
        btEnter.setBackgroundResource(R.drawable.num_back3); // новый фон
        isStart = 0;
    }
Как то можно в методах и потоках получить последовательное выполнение вызовов? Желательно со ссылками или примерами.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.09.2016, 03:06
Ответы с готовыми решениями:

Писать несколько обработчиков для одного события или один обработчик, в котором вызывать методы?
Например есть событие Click. Для него автоматически создается обработчик button_Click (object sender, EventArgs e) Мне нужно...

Как вызывать методы в C#?
Как вызвать метод а(), который содержит 4 аргумента? class Program { static void Main(string args) { ...

Как вызывать методы из нативных либ?
Есть &quot;программа&quot; и есть кучка DLL и TLB. API этой &quot;программы&quot;. &quot;Программа&quot; только под windows. Для .NET авторы &quot;программы&quot;...

19
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
09.09.2016, 08:36
gvsp, если потоки выполняются друг за другом то 1 зачем их много - засуньте все в один 2 - если хотите остаться при своём то по окончании потока инициируйте выполнение следующего. Если у вас все-таки параллельная работа нескольких потоков и вам нужно дождаться её завершения - используйте в ждущем потоке join для всех потоков которые он ждёт (только не делайте этого в UI потоке). Что касается кнопок - если надо их активировать после отработки - пошлите по её окончанию Активити сообщение обработав которое она активирует кнопки
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
09.09.2016, 10:10
Цитата Сообщение от gvsp Посмотреть сообщение
Например строки 6-7 выполняются после цикла 15-17
это невозможно, поскольку у вас идёт последовательное выполнение внутри одного потока.
0
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
12.09.2016, 10:05  [ТС]
CoolMind, Да, в четвёртом часу ночи ещё не то покажется. Спать надо, а не кодить на языках, продолжения которых не знаю

Но, кстати подскажите дилетанту, можно, как то упростить мои коды, а то они рабочие, но смешные. В общем очень часто мне надо делать по нажатии кнопки:
1. Изменить текст
2. Что то посчитать
3. Подождать
4. Изменить текст
и т.д.

А так, как обновление экрана проходит один раз за работу метода или потока, то делаю так:
Дальше просьба нервным не смотреть!
Вызываю AsyncTask_1.
В нём в onPreExecute изменяю текст. В doInBackground считаю если что то надо. В onPostExecute ставлю если надо паузу и вызываю AsyncTask_2.
Далее что то делаю в AsyncTask_2 и вызываю AsyncTask_3 и т.д.
Ибо в одном потоке экран только дважды обновляется, а если делать код в методе:
Java
1
2
3
4
5
myMetod(); // вызываю метом откуда то
// ...
public void myMetod(){ // сам метод
        // Код с паузами и обновлениями экрана.
    }
То обновление экрана проходит только один раз в конце работы метода.
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
13.09.2016, 10:49
Цитата Сообщение от gvsp Посмотреть сообщение
Спать надо, а не кодить на языках, продолжения которых не знаю
Это точно! Тоже стал так делать и прихожу в ужас.
Цитата Сообщение от gvsp Посмотреть сообщение
То обновление экрана проходит только один раз в конце работы метода.
Честно говоря, не понял, какой у вас вопрос. Или вы поделились наблюдением?
Я тоже раньше работал с AsyncTask и вызывал один из другого, сейчас перестал так делать.
0
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 11:16  [ТС]
CoolMind, Вопрос, где в Яве можно программировать последовательно? Например написать строки:
1. Изменить текст_1
2. Что то посчитать
3. Подождать
4. Изменить текст_2
и т.д.
И они будут работать так: изменился текст_1, посчиталось, прошла пауза, изменился текст_2 и т.д.
Например если я забью эти строчки в Онклике, то оно сработает не по тому порядку, что в строках, а так: посчитает, подождёт, изменит оба текста.
В итоге использую единственный найденный мной выход - каждую операцию делаю в новом потоке.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
13.09.2016, 11:21
короче, что конкретно надо сделать?
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
13.09.2016, 11:35
Цитата Сообщение от gvsp Посмотреть сообщение
посчитает, подождёт, изменит оба текста.
Запутался. Почему изменит оба текста? Вы там что, одновременно оба потока запускаете или во втором меняете оба текста?
0
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 11:43  [ТС]
Паблито, Конкретно много что
Это не конкретный код, а просто пример:
Java
1
2
3
4
5
6
7
8
Button btEnter = ((Button) findViewById(R.id.start)); 
 btEnter.setText("СТАРТ"); // меняем надпись на кнопке
TimeUnit.MILLISECONDS.sleep(100); // ждём 100 мс
btEnter.setBackgroundResource(R.drawable.num_back3); // меняем фон на кнопке
TimeUnit.MILLISECONDS.sleep(200); // ждём 200 мс
AudioTrack at = generateTone(freq, duration); 
clearMemory(at) // очистка ресурсов генератора звука
// и .д.
И чтобы это работало так: На кнопке менялась надпись, через 100 мс на кнопке менялся фон, потом через 200 мс запускалась очистка ресурсов и т.д.

Добавлено через 3 минуты
Цитата Сообщение от CoolMind Посмотреть сообщение
Почему изменит оба текста?
Потому, что Онклик делает одно обновление экрана, соответственно выглядит это так, что кажется, что сначала выполняются паузы, а потом сразу всё меняется. Например если задать изменение одного и того же текста два раза через паузу. то первого изменения вообще не видно, ибо после него экран не обновляется.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
13.09.2016, 11:46
если коротко, о надо все делать в отдельном потоке - задержки, пересчеты, а когда надо повремени - обновлять UI в основном потоке
0
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 11:56  [ТС]
Паблито, Т.е. всё таки необходимо метаться между потоками. А если скажем я начну выводить текст по одной букве?
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
TextView helloTextView = (TextView)findViewById(R.id.textView);
helloTextView.setText("H");
TimeUnit.MILLISECONDS.sleep(100);
helloTextView.setText("He");
TimeUnit.MILLISECONDS.sleep(100);
helloTextView.setText("Hel");
TimeUnit.MILLISECONDS.sleep(100);
helloTextView.setText("Hell");
TimeUnit.MILLISECONDS.sleep(100);
helloTextView.setText("Hello");
TimeUnit.MILLISECONDS.sleep(100);
helloTextView.setText("Hello ");
TimeUnit.MILLISECONDS.sleep(100);
helloTextView.setText("Hello ");
TimeUnit.MILLISECONDS.sleep(100);
helloTextView.setText("Hello W");
TimeUnit.MILLISECONDS.sleep(100);
helloTextView.setText("Hello Wo");
TimeUnit.MILLISECONDS.sleep(100);
helloTextView.setText("Hello Wor");
TimeUnit.MILLISECONDS.sleep(100);
helloTextView.setText("Hello Worl");
TimeUnit.MILLISECONDS.sleep(100);
helloTextView.setText("Hello World");
TimeUnit.MILLISECONDS.sleep(100);
helloTextView.setText("Hello World!");
что же, после каждой второй строчки надо заново к UI обращаться?
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
13.09.2016, 12:04
это можно сделать несколькими способами, потому я и спросил что конкретно надо сделать
0
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 12:20  [ТС]
Паблито, Назовите хоть один. потому, что я знаю только один способ - вызвать
Java
1
2
helloTextView.setText("H");
TimeUnit.MILLISECONDS.sleep(100);
в потоке. Потом из этого потока вызвать новый поток с новыми буквами и т.д. Так вся программа и прыгает из потока в поток, что наверное не есть правильно, хотя работает стабильно, потоки тьфу-тьфу ресурсы заметно не забивают, вот только код очень длинный выходит - каждые две три строчки в новом потоке.

Добавлено через 6 минут
Только список/массив или как там не предлагайте. Всё же буквы по порядку выводить на самом деле не приходится. Вот фактическая задача была:
1. Изменить текст и рисунок.
2 Пять раз в цикле фор вызвать поток с паузой после каждого вызова.
3. Изменить текст и рисунок.
4. Пять раз в цикле фор вызвать другой поток с паузой после каждого вызова.
и т.д.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
13.09.2016, 13:21
gvsp, погугли класс Thread

Добавлено через 4 минуты
Если коротко, то что ты написал, делается так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 final Handler myHandler = new Handler();
        Thread myThread = new Thread(new Runnable() {
            @Override
            public void run() {
               myHandler.post(new Runnable() {
                                                @Override
                                                public void run() {
                                                    TextView helloTextView = (TextView)findViewById(R.id.textView);
                                                    helloTextView.setText("H");
                                                }
                                            });
                                           TimeUnit.MILLISECONDS.sleep(100);
                                            ....
            }
        });
        myThread.setPriority(6);
        myThread.start();
Добавлено через 47 секунд
Точнее не делается, а можно так сделать.
1
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 17:06  [ТС]
ExFau$t, А многоточие с чего будет начинаться?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
13.09.2016, 19:49
gvsp, в смысле? Это не элемент кода, это типо продолжение, дописываешь туда всё остальное.
0
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 21:04  [ТС]
ExFau$t, Я понял, что это и т.д. Я не понял с какой строчки продолжать с myHandler.post(new Runnable() { ?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
13.09.2016, 21:08
gvsp, со строчки, где стоит многоточие.
0
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
14.09.2016, 01:29  [ТС]
ExFau$t, Спрошу по другому. Начало повторяющегося блока где?
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
final Handler myHandler = new Handler();
Thread myThread = new Thread(new Runnable() {
    @Override
    public void run() {
        myHandler.post(new Runnable() {
            @Override
            public void run() {
                TextView helloTextView = (TextView)findViewById(R.id.textView);
                helloTextView.setText("H");
            }
        });
        TimeUnit.MILLISECONDS.sleep(100);
        // второй блок
        myHandler.post(new Runnable() {
            @Override
            public void run() {
                helloTextView.setText("He");
            }
        });
        TimeUnit.MILLISECONDS.sleep(100);
    }
});
// третий блок
myHandler.post(new Runnable() {
@Override
public void run() {
        helloTextView.setText("Hel");
        }
        });
        TimeUnit.MILLISECONDS.sleep(100);
        }
        });
        myThread.setPriority(6);
        myThread.start();
Так?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
14.09.2016, 10:54
Так, внутри треда всякие действия, всё что с ui суёшь в хандлер.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.09.2016, 10:54
Помогаю со студенческими работами здесь

Можно ли в java вызывать методы в цикле?
можно ли в java как-нибудь вызывать методы в цикле? for (int i=1;i&lt;10;i++) { pi(); } так, чтобы по...

Как вызывать методы C# ASP.NET Core в JS?
Как вызывать методы C# ASP.NET Core в JS?

Хочется вызывать статические методы без префикса объекта
Технология ASP (С#). Есть объект, у него много статичных методов. Хочется вызывать их без префикса объекта как в JS: with (Math){ x...

Можно ли вызывать магические методы без выполнения условия?
На сколько мне известно магические методы будут вызваны неявно при определенных условиях. Так можно ли их вызвать без выполнения условия?

Как называются методы, которые можно вызывать на любых обьектах?
5 клас 2-ая четверть. Методы Как называются методы, которые можно вызывать на любых обьектах. &lt;object&gt;.PlusDvaAndWriteLn();


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru