Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

09.09.2016, 03:06. Просмотров 547. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вызывать последовательно методы или потоки (Программирование 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...

19
vxg
Модератор
3224 / 2027 / 231
Регистрация: 13.01.2012
Сообщений: 7,868
09.09.2016, 08:36 #2
gvsp, если потоки выполняются друг за другом то 1 зачем их много - засуньте все в один 2 - если хотите остаться при своём то по окончании потока инициируйте выполнение следующего. Если у вас все-таки параллельная работа нескольких потоков и вам нужно дождаться её завершения - используйте в ждущем потоке join для всех потоков которые он ждёт (только не делайте этого в UI потоке). Что касается кнопок - если надо их активировать после отработки - пошлите по её окончанию Активити сообщение обработав которое она активирует кнопки
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,733
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
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,733
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
2631 / 2113 / 656
Регистрация: 12.05.2014
Сообщений: 7,398
Завершенные тесты: 1
13.09.2016, 11:21 #7
короче, что конкретно надо сделать?
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,733
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
2631 / 2113 / 656
Регистрация: 12.05.2014
Сообщений: 7,398
Завершенные тесты: 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
2631 / 2113 / 656
Регистрация: 12.05.2014
Сообщений: 7,398
Завершенные тесты: 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
506 / 461 / 98
Регистрация: 08.05.2012
Сообщений: 2,311
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
13.09.2016, 17:06
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...


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

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

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