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

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

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

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

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

Добрый вечер! У меня в цикле происходят длительные вычисления, поэтому я решил сделать вот что: во-первых, они выполняются в отдельном потоке, а во-вторых я прикрутил ProgressBar и на каждой итерации к полосе прогресса прибавляется значение шага. Количество итераций известно, поэтому значение шага равно 100/кол_во_итераций. Вычисления начинаются по нажатию на кнопку. Когда на нее жму, то фокус с этой кнопки не пропадает, а полоса прогресса не прибавляется, кажется как будто программа зависла. Как сделать так, чтобы при нажатии фокус исчезал, а полоса прибавлялась?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2012, 19:30     Обновление ProgressBar во время длительной операции
Посмотрите здесь:
Обновление ProgressBar из основного потока Android
Android ProgressBar во время загрузки данных
Android Обновление recyclerview во время скрола
Android ProgressBar
Запустить progressbar Android
Android TextView in ProgressBar
Остановка ProgressBar Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.09.2012, 20:10     Обновление ProgressBar во время длительной операции #2
http://developer.android.com/referen...AsyncTask.html
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
27.09.2012, 16:07  [ТС]     Обновление ProgressBar во время длительной операции #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 - соответственно экземпляр данного класса. Есть идеи, как сделать, чтобы работало так, как мне нужно?
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
02.10.2012, 16:47  [ТС]     Обновление ProgressBar во время длительной операции #4
Да, жалко конечно что моя задача настолько нетепична и нестандартна, что ни у кого даже мысли нету, как ее исправить или дать хотя бы совет
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.10.2012, 18:48     Обновление ProgressBar во время длительной операции #5
та вроде все правильно, ничего нестандартного, все должно работать.
без проекта не разобраться...

Добавлено через 1 минуту
VozvedStep.setResult(result);
вот это должно быть в onPostExecute
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
02.10.2012, 19:17  [ТС]     Обновление ProgressBar во время длительной операции #6
V0v1k, спасибо, но я этот кусок кода уже изменил, но все осталось также. Вот прикрепляю весь проект. А может такое быть, что от устройства зависит? Просто я на планшете проверяю, на виртуалке даже не запускал, сейчас попробую.
Вложения
Тип файла: 7z NewArchive.7z (46.3 Кб, 8 просмотров)
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.10.2012, 21:18     Обновление ProgressBar во время длительной операции #7
зависает из-за этого - long res = mt.get();
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
02.10.2012, 22:56  [ТС]     Обновление ProgressBar во время длительной операции #8
V0v1k, ну я таким образом возвращаю посчитанный результат. А как тогда иначе?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.10.2012, 23:20     Обновление ProgressBar во время длительной операции #9
в onPostExecute.
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
03.10.2012, 11:29  [ТС]     Обновление ProgressBar во время длительной операции #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);
Но ничего не изменилось, полоса заполняется после того, как закончатся вычисления.. Блин, странно как-то, в интернете находил примеры в основном с крутящимся кружком, попробую с ним сделать, может для полосы это не канает.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
03.10.2012, 11:50     Обновление ProgressBar во время длительной операции #11
в том проекте что вы выложили publishProgress не вызывается в цикле подсчета результата. может в этом проблема?
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
12.10.2012, 03:54  [ТС]     Обновление ProgressBar во время длительной операции #12
V0v1k, извини что долго не отвечал, это не решило проблему.. Ладно, потом на досуге займусь как-нибудь, спасибо большое за помощь)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2012, 23:35     Обновление ProgressBar во время длительной операции
Еще ссылки по теме:
Цвет ProgressBar Android
Про Handler и ProgressBar Android
Android Параллелизация работы с ProgressBar-ом
ProgressBar в виде фигуры человечка Android
Android Объясните про параметры ProgressBar

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

Или воспользуйтесь поиском по форуму:
Chipito
0 / 0 / 0
Регистрация: 20.11.2011
Сообщений: 29
13.12.2012, 23:35     Обновление ProgressBar во время длительной операции #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;
                }
               
        }
Возможно и поздно, но все равно попробуй)
Yandex
Объявления
13.12.2012, 23:35     Обновление ProgressBar во время длительной операции
Ответ Создать тему
Опции темы

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