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

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

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

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

09.09.2016, 03:06. Просмотров 427. Ответов 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):

Потоки, asyncTask или thread? - Программирование Android
Мне нужно отправить запрос на сервер и загрузить с него инфу в мой ListFragment(данные на сервере хранятся в формате json). При этом запрос...

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

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

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

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

Как вызывать методы класса по перебору массива с именами методов - PHP ООП
Сабж... Вот код: class CApplication { public static function actionIndex() { echo &quot;Main!&quot;; } public...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vxg
Модератор
3156 / 1958 / 218
Регистрация: 13.01.2012
Сообщений: 7,487
09.09.2016, 08:36 #2
gvsp, если потоки выполняются друг за другом то 1 зачем их много - засуньте все в один 2 - если хотите остаться при своём то по окончании потока инициируйте выполнение следующего. Если у вас все-таки параллельная работа нескольких потоков и вам нужно дождаться её завершения - используйте в ждущем потоке join для всех потоков которые он ждёт (только не делайте этого в UI потоке). Что касается кнопок - если надо их активировать после отработки - пошлите по её окончанию Активити сообщение обработав которое она активирует кнопки
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
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,727
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 и т.д.
Например если я забью эти строчки в Онклике, то оно сработает не по тому порядку, что в строках, а так: посчитает, подождёт, изменит оба текста.
В итоге использую единственный найденный мной выход - каждую операцию делаю в новом потоке.
Pablito
2471 / 1916 / 595
Регистрация: 12.05.2014
Сообщений: 6,741
Завершенные тесты: 1
13.09.2016, 11:21 #7
короче, что конкретно надо сделать?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
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 Посмотреть сообщение
Почему изменит оба текста?
Потому, что Онклик делает одно обновление экрана, соответственно выглядит это так, что кажется, что сначала выполняются паузы, а потом сразу всё меняется. Например если задать изменение одного и того же текста два раза через паузу. то первого изменения вообще не видно, ибо после него экран не обновляется.
Pablito
2471 / 1916 / 595
Регистрация: 12.05.2014
Сообщений: 6,741
Завершенные тесты: 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 обращаться?
Pablito
2471 / 1916 / 595
Регистрация: 12.05.2014
Сообщений: 6,741
Завершенные тесты: 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
272 / 247 / 43
Регистрация: 08.05.2012
Сообщений: 1,350
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, А многоточие с чего будет начинаться?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2016, 17:06
Привет! Вот еще темы с ответами:

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

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

Как сделать, чтобы методы выполнялись последовательно - Objective-C
Добрый день! У меня есть контролер, в нём 2 метода: добавление графики и загрузка данных с сервера. Когда я перехожу в этот контролер, то...

Будет ли корректным вызывать внутри методов get или set другие функции или менять свойства контролов? - C#
Всем привет. Скажите разрешается, не в том смысле, что понятно все разрешено, а будет ли корректным вызывать внутри методов get или set...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.09.2016, 17:06
Ответ Создать тему
Опции темы

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