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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
#1

Обновление ProgressBar во время длительной операции - Программирование Android

26.09.2012, 19:30. Просмотров 2285. Ответов 12
Метки нет (Все метки)

Добрый вечер! У меня в цикле происходят длительные вычисления, поэтому я решил сделать вот что: во-первых, они выполняются в отдельном потоке, а во-вторых я прикрутил ProgressBar и на каждой итерации к полосе прогресса прибавляется значение шага. Количество итераций известно, поэтому значение шага равно 100/кол_во_итераций. Вычисления начинаются по нажатию на кнопку. Когда на нее жму, то фокус с этой кнопки не пропадает, а полоса прогресса не прибавляется, кажется как будто программа зависла. Как сделать так, чтобы при нажатии фокус исчезал, а полоса прибавлялась?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2012, 19:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обновление ProgressBar во время длительной операции (Программирование Android):

Обновление ProgressBar из основного потока - Программирование Android
Здравствуйте! Итак, имеется долго выполняющийся код , внутри которого время от времени должно обновляться значение ProgressBar. Следом...

ProgressBar во время загрузки данных - Программирование Android
Есть activity с navigationdrawer-ом, который переставляет фрагменты. В центре фрагмента крутится прогресс бар, а позади него ListView с...

Обновление recyclerview во время скрола - Программирование Android
Как правильно обновлять данные во время скрола recyclerview?? Просто я очищаю адаптер recyclerview, отправляю запрос на сервер, получаю...

На время длительной операции отображать заставку - Delphi БД
Когда нужно совершить операции с несколькими сотнями (тысячами) записей, в программе появляется пауза. Хочу ее заполнить каким-нибудь...

Нажатие на кнопку во время длительной операции - Delphi
Задача такова: при нажатии на кнопку запускается какое-то действие, например, while a:=true do Пока оно что-то там делает, нужно нажать...

Обновление значения элемента Progressbar во время выполнения программы - C#
На форме есть: 1.кнопка, запускающая загрузку файлов из Интернета с использованием webClient 2. ProgressBar, который отображает погресс...

12
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.09.2012, 20:10 #2
http://developer.android.com/reference/android/os/AsyncTask.html
1
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
27.09.2012, 16:07  [ТС] #3
Написал, но работает ни чуть не лучше, чем было с потоками или вообще без них - также полоса заполняется в самом конце и программа по ходу зависает. Вот код с вычислением:
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
35
36
37
class MyTask extends AsyncTask<VozvedStep,Integer,Void>
        {
                protected void onPreExecute()
                {
                        progressBar.setProgress(0);
                }
                protected void onPostExecute()
                {
                        progressBar.setProgress(100);
                }
                protected Void doInBackground(VozvedStep... p1)
                {
                        double res = p1[0].getA();
                        double result = 1;
                        String strX = new String();
                        strX = p1[0].getStrX();
                        int s = p1[0].getS();
                        int p = p1[0].getP();
                        double h = 100/s, progress = h;
                        result = Math.pow(res, strX.charAt(s)-'0');
                        this.publishProgress((int)progress);
                        for (int i = 0; i < s; ++i)
                        {
                                res = (res*res)%p;
                                result *= Math.pow(res, strX.charAt(s-1-i)-'0');
                                result %= p;
                                progress+=h;
                                this.publishProgress((int)progress);
                        }
                        VozvedStep.setResult(result);
                        return null;
                }
                protected void onProgressUpdate(Integer... p1)
                {
                        progressBar.setProgress(p1[0]);
                } 
        }
Обработчик onclick:
Java
1
new MyTask().execute(this.vozvedStep);
Поясню: VozvedStep-это класс, в котором содержатся данные для вычислений, vozvedStep - соответственно экземпляр данного класса. Есть идеи, как сделать, чтобы работало так, как мне нужно?
0
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
02.10.2012, 16:47  [ТС] #4
Да, жалко конечно что моя задача настолько нетепична и нестандартна, что ни у кого даже мысли нету, как ее исправить или дать хотя бы совет
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.10.2012, 18:48 #5
та вроде все правильно, ничего нестандартного, все должно работать.
без проекта не разобраться...

Добавлено через 1 минуту
VozvedStep.setResult(result);
вот это должно быть в onPostExecute
1
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
02.10.2012, 19:17  [ТС] #6
V0v1k, спасибо, но я этот кусок кода уже изменил, но все осталось также. Вот прикрепляю весь проект. А может такое быть, что от устройства зависит? Просто я на планшете проверяю, на виртуалке даже не запускал, сейчас попробую.
0
Вложения
Тип файла: 7z NewArchive.7z (46.3 Кб, 8 просмотров)
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.10.2012, 21:18 #7
зависает из-за этого - long res = mt.get();
0
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
02.10.2012, 22:56  [ТС] #8
V0v1k, ну я таким образом возвращаю посчитанный результат. А как тогда иначе?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.10.2012, 23:20 #9
в onPostExecute.
1
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
03.10.2012, 11:29  [ТС] #10
V0v1k, благодарю за помощь, сделал вот так:
теперь onPostExecute выглядит следующим образом
Java
1
2
3
4
5
protected void onPostExecute(Long result)
{
progressBar.SetProgress(100);
resText.setText("Ответ: " + Long.toString(result));
}
Вызов потока следующим образом:
Java
1
new MyTask().execute(this.vozvedStep);
Но ничего не изменилось, полоса заполняется после того, как закончатся вычисления.. Блин, странно как-то, в интернете находил примеры в основном с крутящимся кружком, попробую с ним сделать, может для полосы это не канает.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
03.10.2012, 11:50 #11
в том проекте что вы выложили publishProgress не вызывается в цикле подсчета результата. может в этом проблема?
1
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
12.10.2012, 03:54  [ТС] #12
V0v1k, извини что долго не отвечал, это не решило проблему.. Ладно, потом на досуге займусь как-нибудь, спасибо большое за помощь)
0
Chipito
0 / 0 / 0
Регистрация: 20.11.2011
Сообщений: 29
13.12.2012, 23:35 #13
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
35
class MyTask extends AsyncTask<VozvedStep,Integer,Void>
        {
                protected void onPreExecute()
                {
                        progressBar.setProgress(0);
                }
                protected void onPostExecute()
                {
                        progressBar.setProgress(100);
                }
                protected Void doInBackground(VozvedStep... p1)
                {
    progressBar.setMax() / тут поставь твоё максимальное значение.
                        double res = p1[0].getA();
                        double result = 1;
                        String strX = new String();
                        strX = p1[0].getStrX();
                        int s = p1[0].getS();
                        int p = p1[0].getP();
                        double h = 100/s, progress = h;
                        result = Math.pow(res, strX.charAt(s)-'0');
                        this.publishProgress((int)progress);
                        for (int i = 0; i < s; ++i)
                        {
                                res = (res*res)%p;
                                result *= Math.pow(res, strX.charAt(s-1-i)-'0');
                                result %= p;
                                progress+=h;
        progressBar.setProgress((int)progress);
                        }
                        VozvedStep.setResult(result);
                        return null;
                }
               
        }
Возможно и поздно, но все равно попробуй)
0
13.12.2012, 23:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2012, 23:35
Привет! Вот еще темы с ответами:

Выполнение длительной операции с выводом прогресса - PHP
Добрый день, есть задача выполнить долгую операцию операцию, при это отображать статус выполнения данной операции. В настоящий момент у...

BSOD во время длительной работы - BSOD
Здравствуйте, решил обратиться к вам с проблемой. Все началось с того что я решил купить гта5 и дополнительно докупить планку...

.NET 4.x Обновление ProgressBar из BackgroundWorker - C#
Вообщем так, нашёл исход с BackgroundWorker`om идвижением progressBar`a, но у меня вылазит такая ошибка: Мб, я не туда действие сую? ...

Параллельное обновление нескольких ProgressBar из разных потоков - Visual Basic .NET
Доброго всем времени суток! Суть проблемы: На форме 2 прогресс бара и 2 кнопки Нажал 1 кнопку запустил 1 поток начал обновляться 1...


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

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

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