2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 86
|
|||||||||||
1 | |||||||||||
Обновление ProgressBar из основного потока07.11.2016, 17:00. Показов 2034. Ответов 5
Метки нет (Все метки)
Здравствуйте!
Итак, имеется долго выполняющийся код [1], внутри которого время от времени должно обновляться значение ProgressBar. Следом идёт другой код [2], который должен выполняться только после выполнения кода [1]. Java: Кликните здесь для просмотра всего текста
xml: Кликните здесь для просмотра всего текста
Проблема в том, что значение ProgressBar обновится только 1 раз и только в конце выполнения основного потока (что вроде логично, но мне не подходит). Можно было бы долго выполняющийся участок кода [1] занести в отдельный поток, а внутри в runOnUiThread(...) обновлять ProgressBar, но тогда код [2] выполнится раньше кода [1], что тоже не подходит. Можно было бы и код [1], и код [2] занести в отдельный поток (чтобы сохранить последовательность выполнения), но такой вариант меня немного пугает, т.к. код [2] довольно большой, в примере он для наглядности упрощён. Какие могут быть решения? Т.е., другими словами, сначала должен выполниться код [1], в нём должен обновляться ProgressBar, затем после кода [1] должен выполниться код [2].
0
|
07.11.2016, 17:00 | |
Ответы с готовыми решениями:
5
Обновление формы происходит из побочного потока вместо основного Выполнение слота основного потока через сигнал второстепенного потока Вызов метода основного потока из второстепенного потока Вызов SaveFileDialog не из основного потока |
4 / 4 / 0
Регистрация: 01.06.2013
Сообщений: 153
|
|
07.11.2016, 17:31 | 2 |
Paket236, можно воспользоваться способом со вторым потоком, а чтобы код 2 не выполнился раньше кода 1, сделать флаг, который выставлялся бы в true только после выполнения большого цикла, и в коде 2 соответственно делать проверку if (flag){.....}
0
|
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 86
|
|
07.11.2016, 17:47 [ТС] | 3 |
kondusov, не совсем Вас понял. В каком потоке должен находиться код [2] ? Если в неосновном (оба кода), то такая проверка (if) не нужна (но такой вариант, как я уже упомянул, когда оба кода в неосновном потоке, меня пугает... хотя, возможно, лучше не придумать). Если в основном, то код [2] просто пропустится (можно сделать не if(), а while{}, чтобы подождать, но тогда UI подвиснет и не будет обновляться ProgressBar). Можете пример привести для ясности?
0
|
4 / 4 / 0
Регистрация: 01.06.2013
Сообщений: 153
|
||||||
07.11.2016, 18:07 | 4 | |||||
Paket236,
Писал с телефона, но вроде должно работать
1
|
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
|
||||||
07.11.2016, 21:34 | 5 | |||||
Большой код в Thread или AcyncTask, туда mDialog.mDialog2.setProgress(progress); . Прогрессбар:
0
|
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 86
|
|
08.11.2016, 12:53 [ТС] | 6 |
kondusov, спасибо! Не то, что я хотел, но лучше вроде и не сделать. Воспользуюсь именно Вашим вариантом.
0
|
08.11.2016, 12:53 | |
08.11.2016, 12:53 | |
Помогаю со студенческими работами здесь
6
Выпадение из основного потока - пересечение Вызов основного потока из фонового Запись в Textbox не из основного потока Доступ к элементу управления не из основного потока Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |