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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
djaba2012
0 / 0 / 0
Регистрация: 02.12.2011
Сообщений: 11
#1

Параллелизация работы с ProgressBar-ом - Android

01.11.2012, 23:17. Просмотров 1068. Ответов 4
Метки нет (Все метки)

Здравсвуйте!

Помогите пожалуйста разобраться с ProgressBar'ом.

Прочитав несколько любительских статей по параллелизации работы ProgressBar'а, в частности вот эту, эту, официальный ман - все-равно не понял как нужно правильно заставить его работать

Цель следующая - чтобы этот самый ProgressBar визуально менял свое состояние по мере того как программа совершает расчеты.

Суть проблемы (а именно необходимость использования потоков) для данной задачи я осознаю.

Чтобы вы получше поняли проблему - кусок кода:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        switch(v.getId()){
        case R.id.button1:
            for (int i = 0; i < 4; i++) {
                new Thread(new Runnable() {
                    public void run() {
                        brown(n += 5, 0.01);
                        myProgress++;                   
                        
                            mHandler.post(new Runnable() {
                                public void run() {
                                 progressBar1.setProgress(myProgress);
                                }
                            });  
                    }
                }).start();   
 
            }   
            textview1.setText("\nComputation is completed\n");
        }


Краткое описание этого кода: нажимаю на кнопочку, в цикле создаются 4 потока в каждом из который происходит расчет функции brown() со своими параметрами, по окончанию расчета MyProgress увеличивается и компонент ProgressBar действительно визуально меняет свое состояние (т.е. каждый поток при завершении своего расчета, сигнализирует о своем завершении визуальным изменением состояния прогрессбара).
Вся беда вышеприведенного кода в том что, полагаю, первый же досчитавший поток, выходит из цикла и выводит в textview сообщение.
Т.е. в идеале и по логике (ну... в смысле я так думаю) сообщение должно быть выделено только после того как все потоки завершат свое вычисление, но получается иначе.

Если же попробовать "поиграться" с кодом, например:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
                new Thread(new Runnable() {
                    public void run() {
                        for (int i = 0; i < 4; i++) {       //!!! FOR перемещен во внутрь
                            brown(n += 5, 0.01);
                            myProgress++;                   
                        
                            mHandler.post(new Runnable() {
                                public void run() {
                                 progressBar1.setProgress(myProgress);
                                }
                            }); 
                        }
                    }    
                }).start();

Сей метод также приведет к вышеописанному результату - первый же завершившийся поток выведет сообщение о завершении вычисления (в то время когда остальные потоки будут находиться в состоянии рассчета)
или
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            for (int i = 0; i < 4; i++) {
                brown(n += 5, 0.01);          //!!! вынесен вызов функции
                new Thread(new Runnable() {
                    public void run() {
                        
                            myProgress++;                   
                        
                            mHandler.post(new Runnable() {
                                public void run() {
                                 progressBar1.setProgress(myProgress);
                                }
                            }); 
                    }    
                }).start();   
            }
В этом случае "оперативного" обновления состояния ProgressBar'а не будет - когда закончится рассчет, ProgressBar моментально изменит свое состояние на 4.
Ну и так далее, про перестановку кода

Собственно вопросы - правильно ли я пытаюсь решить данную проблему? Как все-таки заставить программу работать так, чтобы дальнейший код (выдача сообщения) совершилась только после того как завершатся все потоки?
Отдельно буду благодарен за ссылку на понятный (!) ман по ProgressBar'у
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2012, 23:17     Параллелизация работы с ProgressBar-ом
Посмотрите здесь:

ProgressBar, крутящийся, пока выполняется post-запрос Android
Про Handler и ProgressBar Android
Android Не получается вывести progressbar в SupportActionBar
ProgressBar в виде фигуры человечка Android
Android Как сделать простой progressbar?
Android ProgressBar
Android ProgressBar во время загрузки данных
Android Объясните про параметры ProgressBar
Запустить progressbar Android
Цвет ProgressBar Android
Обновление ProgressBar из основного потока Android
Android Изменить точку старта в ProgressBar

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.11.2012, 23:45     Параллелизация работы с ProgressBar-ом #2
Цитата Сообщение от djaba2012 Посмотреть сообщение
Вся беда вышеприведенного кода в том что, полагаю, первый же досчитавший поток, выходит из цикла и выводит в textview сообщение.
нет, это происходит сразу же после старта всех потоков.

Цитата Сообщение от djaba2012 Посмотреть сообщение
Сей метод также приведет к вышеописанному результату - первый же завершившийся поток выведет сообщение о завершении вычисления (в то время когда остальные потоки будут находиться в состоянии рассчета)
здесь вообще не видно где вы сообщение выводите


Цитата Сообщение от djaba2012 Посмотреть сообщение
В этом случае "оперативного" обновления состояния ProgressBar'а
в этом случае подсчет вообще не вынесен в поток.



Цитата Сообщение от djaba2012 Посмотреть сообщение
Как все-таки заставить программу работать так, чтобы дальнейший код (выдача сообщения) совершилась только после того как завершатся все потоки?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
switch(v.getId()){
        case R.id.button1:
            for (int i = 0; i < 4; i++) {
                new Thread(new Runnable() {
                    public void run() {
                        brown(n += 5, 0.01);
                        myProgress++;                   
                        
                            mHandler.post(new Runnable() {
                                public void run() {
                                 progressBar1.setProgress(myProgress);
                                 if(myProgress == max) {
                                                  textview1.setText("\nComputation is completed\n");
                                  }
                                }
                            });  
                    }
                }).start();   
 
            }   
           
        }
mks81
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
02.11.2012, 02:17     Параллелизация работы с ProgressBar-ом #3
Я даже вникать не стал, мысль на столько глубока, что я не могу найти себе место

Добавлено через 2 минуты
Всем спасибо!)

Добавлено через 18 минут
а вообще я вопроса не понял

Добавлено через 6 минут
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
switch(v.getId()){
        case R.id.button1:
            for (int i = 0; i < 4; i++) {
                new Thread(new Runnable() {
                    public void run() {
                        brown(n += 5, 0.01);
                        myProgress++;                   
                        
                            mHandler.post(new Runnable() {
                                public void run() {
                                 progressBar1.setProgress(myProgress);
                                 if(myProgress == max) {
                                                  textview1.setText("\nComputation is completed\n");
                                  }
                                }
                            });  
                    }
                }).start();
бляяяя, я не знаю че делать, меня прет!!!

Добавлено через 7 минут
бля!!!! повторюсь! Видимо я дурак!
djaba2012
0 / 0 / 0
Регистрация: 02.12.2011
Сообщений: 11
02.11.2012, 06:50  [ТС]     Параллелизация работы с ProgressBar-ом #4
Так просто?

Java
1
2
3
                                 if(myProgress == max) {
                                                  textview1.setText("\nComputation is completed\n");
                                  }
Тогда еще одно уточнение - а это именно самая настоящая корректная реализация?
Просто очень похоже это на "закручивание гаек"
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.11.2012, 11:18     Параллелизация работы с ProgressBar-ом #5
ну это пример, иф может выглядеть и как-то так:
1) if(isAllThreadDone())
2) if(isComputationCompleted)
3) if(isComputationCompleted())
Yandex
Объявления
02.11.2012, 11:18     Параллелизация работы с ProgressBar-ом
Ответ Создать тему
Опции темы

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