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

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

09.09.2016, 03:06. Просмотров 597. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2016, 03:06
Ответы с готовыми решениями:

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

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

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

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

Как называются методы, которые можно вызывать на любых обьектах?
5 клас 2-ая четверть. Методы Как называются методы, которые можно вызывать на любых обьектах....

19
vxg
Модератор
3287 / 2082 / 329
Регистрация: 13.01.2012
Сообщений: 8,104
09.09.2016, 08:36 2
gvsp, если потоки выполняются друг за другом то 1 зачем их много - засуньте все в один 2 - если хотите остаться при своём то по окончании потока инициируйте выполнение следующего. Если у вас все-таки параллельная работа нескольких потоков и вам нужно дождаться её завершения - используйте в ждущем потоке join для всех потоков которые он ждёт (только не делайте этого в UI потоке). Что касается кнопок - если надо их активировать после отработки - пошлите по её окончанию Активити сообщение обработав которое она активирует кнопки
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,734
09.09.2016, 10:10 3
Цитата Сообщение от gvsp Посмотреть сообщение
Например строки 6-7 выполняются после цикла 15-17
это невозможно, поскольку у вас идёт последовательное выполнение внутри одного потока.
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
12.09.2016, 10:05  [ТС] 4
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
12.09.2016, 10:05
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,734
13.09.2016, 10:49 5
Цитата Сообщение от gvsp Посмотреть сообщение
Спать надо, а не кодить на языках, продолжения которых не знаю
Это точно! Тоже стал так делать и прихожу в ужас.
Цитата Сообщение от gvsp Посмотреть сообщение
То обновление экрана проходит только один раз в конце работы метода.
Честно говоря, не понял, какой у вас вопрос. Или вы поделились наблюдением?
Я тоже раньше работал с AsyncTask и вызывал один из другого, сейчас перестал так делать.
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 11:16  [ТС] 6
CoolMind, Вопрос, где в Яве можно программировать последовательно? Например написать строки:
1. Изменить текст_1
2. Что то посчитать
3. Подождать
4. Изменить текст_2
и т.д.
И они будут работать так: изменился текст_1, посчиталось, прошла пауза, изменился текст_2 и т.д.
Например если я забью эти строчки в Онклике, то оно сработает не по тому порядку, что в строках, а так: посчитает, подождёт, изменит оба текста.
В итоге использую единственный найденный мной выход - каждую операцию делаю в новом потоке.
0
Pablito
2836 / 2254 / 762
Регистрация: 12.05.2014
Сообщений: 7,892
Завершенные тесты: 1
13.09.2016, 11:21 7
короче, что конкретно надо сделать?
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,734
13.09.2016, 11:35 8
Цитата Сообщение от gvsp Посмотреть сообщение
посчитает, подождёт, изменит оба текста.
Запутался. Почему изменит оба текста? Вы там что, одновременно оба потока запускаете или во втором меняете оба текста?
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 11:43  [ТС] 9
Паблито, Конкретно много что
Это не конкретный код, а просто пример:
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
Pablito
2836 / 2254 / 762
Регистрация: 12.05.2014
Сообщений: 7,892
Завершенные тесты: 1
13.09.2016, 11:46 10
если коротко, о надо все делать в отдельном потоке - задержки, пересчеты, а когда надо повремени - обновлять UI в основном потоке
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 11:56  [ТС] 11
Паблито, Т.е. всё таки необходимо метаться между потоками. А если скажем я начну выводить текст по одной букве?
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
Pablito
2836 / 2254 / 762
Регистрация: 12.05.2014
Сообщений: 7,892
Завершенные тесты: 1
13.09.2016, 12:04 12
это можно сделать несколькими способами, потому я и спросил что конкретно надо сделать
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 12:20  [ТС] 13
Паблито, Назовите хоть один. потому, что я знаю только один способ - вызвать
Java
1
2
helloTextView.setText("H");
TimeUnit.MILLISECONDS.sleep(100);
в потоке. Потом из этого потока вызвать новый поток с новыми буквами и т.д. Так вся программа и прыгает из потока в поток, что наверное не есть правильно, хотя работает стабильно, потоки тьфу-тьфу ресурсы заметно не забивают, вот только код очень длинный выходит - каждые две три строчки в новом потоке.

Добавлено через 6 минут
Только список/массив или как там не предлагайте. Всё же буквы по порядку выводить на самом деле не приходится. Вот фактическая задача была:
1. Изменить текст и рисунок.
2 Пять раз в цикле фор вызвать поток с паузой после каждого вызова.
3. Изменить текст и рисунок.
4. Пять раз в цикле фор вызвать другой поток с паузой после каждого вызова.
и т.д.
0
ExFau$t
766 / 631 / 158
Регистрация: 08.05.2012
Сообщений: 3,079
13.09.2016, 13:21 14
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
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 17:06  [ТС] 15
ExFau$t, А многоточие с чего будет начинаться?
0
ExFau$t
766 / 631 / 158
Регистрация: 08.05.2012
Сообщений: 3,079
13.09.2016, 19:49 16
gvsp, в смысле? Это не элемент кода, это типо продолжение, дописываешь туда всё остальное.
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 21:04  [ТС] 17
ExFau$t, Я понял, что это и т.д. Я не понял с какой строчки продолжать с myHandler.post(new Runnable() { ?
0
ExFau$t
766 / 631 / 158
Регистрация: 08.05.2012
Сообщений: 3,079
13.09.2016, 21:08 18
gvsp, со строчки, где стоит многоточие.
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
14.09.2016, 01:29  [ТС] 19
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
ExFau$t
766 / 631 / 158
Регистрация: 08.05.2012
Сообщений: 3,079
14.09.2016, 10:54 20
Так, внутри треда всякие действия, всё что с ui суёшь в хандлер.
1
14.09.2016, 10:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2016, 10:54

Как вызывать методы класса по перебору массива с именами методов
Сабж... Вот код: class CApplication { public static function actionIndex() { echo...

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

Как из метода созданного класса вызывать методы WindowsForms (наприме вывод текста в TextBox)
Помогите пожалуйста! Я изучаю С# и надеюсь на вашу помощь... В общем создаю класс в методах этого...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru