Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
gvsp
13 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 71
#1

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

09.09.2016, 03:06. Просмотров 327. Ответов 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;
    }
Как то можно в методах и потоках получить последовательное выполнение вызовов? Желательно со ссылками или примерами.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2016, 03:06     Вызывать последовательно методы или потоки
Посмотрите здесь:

Android Потоки
Android Потоки и post запрос
Android Как можно вызывать один класс в разных activity?
Android потоки
Потоки и AlertDialog Android
Потоки. Thread и runOnUiThread Android
Android Потоки, asyncTask или thread?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,907
09.09.2016, 08:36     Вызывать последовательно методы или потоки #2
gvsp, если потоки выполняются друг за другом то 1 зачем их много - засуньте все в один 2 - если хотите остаться при своём то по окончании потока инициируйте выполнение следующего. Если у вас все-таки параллельная работа нескольких потоков и вам нужно дождаться её завершения - используйте в ждущем потоке join для всех потоков которые он ждёт (только не делайте этого в UI потоке). Что касается кнопок - если надо их активировать после отработки - пошлите по её окончанию Активити сообщение обработав которое она активирует кнопки
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
09.09.2016, 10:10     Вызывать последовательно методы или потоки #3
Цитата Сообщение от gvsp Посмотреть сообщение
Например строки 6-7 выполняются после цикла 15-17
это невозможно, поскольку у вас идёт последовательное выполнение внутри одного потока.
gvsp
13 / 2 / 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(){ // сам метод
        // Код с паузами и обновлениями экрана.
    }
То обновление экрана проходит только один раз в конце работы метода.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
13.09.2016, 10:49     Вызывать последовательно методы или потоки #5
Цитата Сообщение от gvsp Посмотреть сообщение
Спать надо, а не кодить на языках, продолжения которых не знаю
Это точно! Тоже стал так делать и прихожу в ужас.
Цитата Сообщение от gvsp Посмотреть сообщение
То обновление экрана проходит только один раз в конце работы метода.
Честно говоря, не понял, какой у вас вопрос. Или вы поделились наблюдением?
Я тоже раньше работал с AsyncTask и вызывал один из другого, сейчас перестал так делать.
gvsp
13 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 11:16  [ТС]     Вызывать последовательно методы или потоки #6
CoolMind, Вопрос, где в Яве можно программировать последовательно? Например написать строки:
1. Изменить текст_1
2. Что то посчитать
3. Подождать
4. Изменить текст_2
и т.д.
И они будут работать так: изменился текст_1, посчиталось, прошла пауза, изменился текст_2 и т.д.
Например если я забью эти строчки в Онклике, то оно сработает не по тому порядку, что в строках, а так: посчитает, подождёт, изменит оба текста.
В итоге использую единственный найденный мной выход - каждую операцию делаю в новом потоке.
Паблито
2012 / 1754 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
13.09.2016, 11:21     Вызывать последовательно методы или потоки #7
короче, что конкретно надо сделать?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
13.09.2016, 11:35     Вызывать последовательно методы или потоки #8
Цитата Сообщение от gvsp Посмотреть сообщение
посчитает, подождёт, изменит оба текста.
Запутался. Почему изменит оба текста? Вы там что, одновременно оба потока запускаете или во втором меняете оба текста?
gvsp
13 / 2 / 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 Посмотреть сообщение
Почему изменит оба текста?
Потому, что Онклик делает одно обновление экрана, соответственно выглядит это так, что кажется, что сначала выполняются паузы, а потом сразу всё меняется. Например если задать изменение одного и того же текста два раза через паузу. то первого изменения вообще не видно, ибо после него экран не обновляется.
Паблито
2012 / 1754 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
13.09.2016, 11:46     Вызывать последовательно методы или потоки #10
если коротко, о надо все делать в отдельном потоке - задержки, пересчеты, а когда надо повремени - обновлять UI в основном потоке
gvsp
13 / 2 / 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 обращаться?
Паблито
2012 / 1754 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
13.09.2016, 12:04     Вызывать последовательно методы или потоки #12
это можно сделать несколькими способами, потому я и спросил что конкретно надо сделать
gvsp
13 / 2 / 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. Пять раз в цикле фор вызвать другой поток с паузой после каждого вызова.
и т.д.
ExFau$t
167 / 150 / 29
Регистрация: 08.05.2012
Сообщений: 946
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 секунд
Точнее не делается, а можно так сделать.
gvsp
13 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 17:06  [ТС]     Вызывать последовательно методы или потоки #15
ExFau$t, А многоточие с чего будет начинаться?
ExFau$t
167 / 150 / 29
Регистрация: 08.05.2012
Сообщений: 946
13.09.2016, 19:49     Вызывать последовательно методы или потоки #16
gvsp, в смысле? Это не элемент кода, это типо продолжение, дописываешь туда всё остальное.
gvsp
13 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 71
13.09.2016, 21:04  [ТС]     Вызывать последовательно методы или потоки #17
ExFau$t, Я понял, что это и т.д. Я не понял с какой строчки продолжать с myHandler.post(new Runnable() { ?
ExFau$t
167 / 150 / 29
Регистрация: 08.05.2012
Сообщений: 946
13.09.2016, 21:08     Вызывать последовательно методы или потоки #18
gvsp, со строчки, где стоит многоточие.
gvsp
13 / 2 / 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();
Так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2016, 10:54     Вызывать последовательно методы или потоки
Еще ссылки по теме:

Обязательно ли вызывать setContentView? Android
Потоки. Доступ к переменным Android
Android Таймер и параллельные потоки
Потоки. Canvas Android
Потоки не работают параллельно Android

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

Или воспользуйтесь поиском по форуму:
ExFau$t
167 / 150 / 29
Регистрация: 08.05.2012
Сообщений: 946
14.09.2016, 10:54     Вызывать последовательно методы или потоки #20
Так, внутри треда всякие действия, всё что с ui суёшь в хандлер.
Yandex
Объявления
14.09.2016, 10:54     Вызывать последовательно методы или потоки
Ответ Создать тему
Опции темы

Текущее время: 23:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru