Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Зеленый1
2 / 2 / 2
Регистрация: 21.04.2011
Сообщений: 100
#1

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

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

Добрый вечер! У меня в цикле происходят длительные вычисления, поэтому я решил сделать вот что: во-первых, они выполняются в отдельном потоке, а во-вторых я прикрутил ProgressBar и на каждой итерации к полосе прогресса прибавляется значение шага. Количество итераций известно, поэтому значение шага равно 100/кол_во_итераций. Вычисления начинаются по нажатию на кнопку. Когда на нее жму, то фокус с этой кнопки не пропадает, а полоса прогресса не прибавляется, кажется как будто программа зависла. Как сделать так, чтобы при нажатии фокус исчезал, а полоса прибавлялась?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2012, 19:30
Ответы с готовыми решениями:

Обновление ProgressBar-a во время загрузки SQLite DB при включении приложения
Добрый день. Моя БД обновляется довольно долго поэтому хотелось бы показать...

Обновление ProgressBar из AsyncTask
Здравствуйте! Есть метод, во время выполнения которого, приложение зависает на...

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

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

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

12
V0v1k
1160 / 984 / 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 / 2
Регистрация: 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 / 2
Регистрация: 21.04.2011
Сообщений: 100
02.10.2012, 16:47  [ТС] #4
Да, жалко конечно что моя задача настолько нетепична и нестандартна, что ни у кого даже мысли нету, как ее исправить или дать хотя бы совет
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.10.2012, 18:48 #5
та вроде все правильно, ничего нестандартного, все должно работать.
без проекта не разобраться...

Добавлено через 1 минуту
VozvedStep.setResult(result);
вот это должно быть в onPostExecute
1
Зеленый1
2 / 2 / 2
Регистрация: 21.04.2011
Сообщений: 100
02.10.2012, 19:17  [ТС] #6
V0v1k, спасибо, но я этот кусок кода уже изменил, но все осталось также. Вот прикрепляю весь проект. А может такое быть, что от устройства зависит? Просто я на планшете проверяю, на виртуалке даже не запускал, сейчас попробую.
0
Вложения
Тип файла: 7z NewArchive.7z (46.3 Кб, 8 просмотров)
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.10.2012, 21:18 #7
зависает из-за этого - long res = mt.get();
0
Зеленый1
2 / 2 / 2
Регистрация: 21.04.2011
Сообщений: 100
02.10.2012, 22:56  [ТС] #8
V0v1k, ну я таким образом возвращаю посчитанный результат. А как тогда иначе?
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.10.2012, 23:20 #9
в onPostExecute.
1
Зеленый1
2 / 2 / 2
Регистрация: 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
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
03.10.2012, 11:50 #11
в том проекте что вы выложили publishProgress не вызывается в цикле подсчета результата. может в этом проблема?
1
Зеленый1
2 / 2 / 2
Регистрация: 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

ProgressBar, отображающий ход длительной операции в Memo
На форме 2 memo и кнопка. В один (m1) я вставляю текст, нажимаю кнопку, после...

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

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


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

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

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