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

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

Войти
Регистрация
Восстановить пароль
 
ChewbaccaCyber
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 13
#1

Как показать ProgressDialog при долгом построении UI? - Программирование Android

27.03.2015, 14:04. Просмотров 550. Ответов 10
Метки нет (Все метки)

Есть две активити.
При нажатии кнопки в первой активити, происходит переход ко второй. Во второй активити в onCreate строится интерфейс.
И сейчас после нажатии кнопки в первой активити некоторое время ничего не происходит, т.е. видна всё та же первая активити, затем некоторое время виден чёрный экран.
Везде пишут, что тяжёлые вычисления надо выносить в отдельный поток, но там же пишут, что нельзя работать из другого потока с UI.
Как быть?
Хочется, чтобы после нажатия кнопки в первом активити, сразу показалась вторая активити с запущенным ProgressDialog и пока крутится индикатор, строился бы интерфейс
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2015, 14:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как показать ProgressDialog при долгом построении UI? (Программирование Android):

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

Progressdialog при выполнении asynctask - Программирование Android
Здравствуйте! Есть asynctask который отправляет запрос и после парсит страницу. Хотел добавить Progressdialog который начинал бы работать...

Как при построении Listview выибрать картинку в зависимости от значения в БД? - Программирование Android
Я использую SimpleCursorAdapter. У меня в БД примерно 1к строк. Я хочу хранить в поле таблицы не всю картинку целиком, а только значение, в...

ProgressDialog - Программирование Android
public class Main_Activity extends Activity { private ProgressDialog pd; private class LogIn extends AsyncTask<Void,...

Не показывается ProgressDialog - Программирование Android
Пробую показать диалог пока идёт такое if (item.getItemId() == android.R.id.home || item.getItemId() == 4) { dialog =...

Запрос http + ProgressDialog - Программирование Android
подскажите пожалуйста как реализовать запрос к php серверу по протоколу http/https?, плюс, чтоб на время запроса и обработки ответа...

10
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
27.03.2015, 14:07 #2
у людей обычно так и происходит - после нажатия кнопки в первом активити, сразу показывается вторая активити сразу с интерфейсом
а если там надо что-то много считать то делай это до того, как первая активити запустит вторую

хотя что там такого можно считать такого сложного что задержка получается долгая?
0
ChewbaccaCyber
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 13
27.03.2015, 14:38  [ТС] #3
хотя что там такого можно считать такого сложного что задержка получается долгая?
Вычисляется количество, размер и взаимное расположение большого количества TextView и других элементов интерфеса
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
27.03.2015, 14:40 #4
значит криво вычисляются если это занимает значительное время
сколько их, сотни-тысячи?
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
27.03.2015, 15:01 #5
Мне кажется, какое-то архитектурное решение неправильное Вы выбрали
0
ChewbaccaCyber
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 13
27.03.2015, 15:32  [ТС] #6
Если сильно упростить до сути, то сейчас вот так:
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
38
39
40
41
42
43
44
45
46
public class AlphabetActivity extends Activity implements View.OnClickListener {
    protected LinearLayout layoutItems;
 
    protected DBHelper dbHelper;
    protected SQLiteDatabase db;
 
    private ProgressDialog progressDlg;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_alphabet);
 
        layoutItems = (LinearLayout) findViewById(R.id.layoutItems);
 
        dbHelper = new DBHelper(this);
        db = dbHelper.getWritableDatabase();
 
        progressDlg = new ProgressDialog(AlphabetActivity.this);
        progressDlg.setCancelable(false);
        progressDlg.setMessage("Пожалуйста, подождите...");
        progressDlg.show();
 
        String sql = "SELECT * FROM table1 ORDER BY title";
        Cursor curItemnames = db.rawQuery(sql, null);
 
        if (curItemnames.moveToFirst()) {
            int titleColIndex = curItemnames.getColumnIndex("title");
            int idColIndex = curItemnames.getColumnIndex("id");
            do {
                String item_name = curItemnames.getString(titleColIndex);
                int item_id =  curItemnames.getInt(idColIndex);
                TextView txtLetter = new TextView(getApplicationContext());
                txtLetter.setTextColor(0xFF303030);
                txtLetter.setBackgroundColor(0xFFF5F5F5);
                txtLetter.setText(item_name);
                txtLetter.setTag(item_id);
                layoutItems.addView(txtLetter);
            } while (curItemnames.moveToNext());
        }
 
        progressDlg.dismiss();
    }
}
В curItemnames 400-800 записей в зависимости от условий.

В таком варианте ProgressDialog никогда не показывается, а продолжительное время виден чёрный экран, а потом сразу готовая активити
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
27.03.2015, 15:37 #7
что мешает все это делать в отдельном потоке и не открывать вторую активити пока не посчитает?
а прогресс показывать в первой
0
ChewbaccaCyber
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 13
27.03.2015, 15:43  [ТС] #8
Мешает то, что из doInBackground нельзя обращаться к UI и у меня происходит исключение на строчке layoutItems.addView(txtLetter);
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
27.03.2015, 15:54 #9
полезно посмотреть https://developer.android.com/reference/android/os/AsyncTask.html
а если своими словами то прямо из doInBackground нужно вызывать publishProgress(...)
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
27.03.2015, 16:35 #10
для вас идеальное решение выводить вычисления в отдельный поток, AsyncTask.

И по ходу выполнения вызывать из doInBackground (основной метод потока) publishProgress(value);
тогда некое значение будет передаваться в метод onProgressUpdate, который уже выполняется в UI потоке. там можно образаться к прогресбару какому-нибудь, и вообще делать все что вам нужно
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
27.03.2015, 16:46 #11
ChewbaccaCyber, onPreExecute() показываем диалог, onPostExecute() скрываем
0
27.03.2015, 16:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2015, 16:46
Привет! Вот еще темы с ответами:

Async_Tasc появление ProgressDialog - Программирование Android
При запуске Async Tasc в onPreExecute() создаётся и должен появится ProgressDialog. но он не появляется сразу. Вызываю AsyncTasc ...

ProgressDialog upload fpt server - Программирование Android
Ребята помогите разобраться private class uploadFileTask extends AsyncTask<Void, Integer, Long> { private...

Ожидание подключения к серверу (ProgressDialog) - Программирование Android
Здравствуйте! Мне нужно, чтобы при переходе на MainActivity вылазил ProgressDialog (он проверяет есть ли подключение к серверу), если...

Intellij Idea 13, ошибка при построении проекта : Unable to execute DX - Программирование Android
Здравствуйте. На чистую винду поставил, JDK 1.7 u45, Itellij Idea 13, Android SDK. В Idea прописал пути до JDK и SDK. Создаю пустой...


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

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

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