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

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

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

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

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

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

progressbar Android
Android ProgressBar
Android TextView in ProgressBar
Про Handler и ProgressBar Android
Android Не получается вывести progressbar в SupportActionBar
progressbar в виде фигуры человечка Android
Android ProgressBar
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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 во время длительной операции
Еще ссылки по теме:

Android ProgressBar во время загрузки данных
Запустить progressbar Android
Цвет ProgressBar Android
Обновление ProgressBar из основного потока Android
Android Обновление recyclerview во время скрола

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

Или воспользуйтесь поиском по форуму:
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 во время длительной операции
Ответ Создать тему
Опции темы

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