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

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

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

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

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

Есть две активити.
При нажатии кнопки в первой активити, происходит переход ко второй. Во второй активити в onCreate строится интерфейс.
И сейчас после нажатии кнопки в первой активити некоторое время ничего не происходит, т.е. видна всё та же первая активити, затем некоторое время виден чёрный экран.
Везде пишут, что тяжёлые вычисления надо выносить в отдельный поток, но там же пишут, что нельзя работать из другого потока с UI.
Как быть?
Хочется, чтобы после нажатия кнопки в первом активити, сразу показалась вторая активити с запущенным ProgressDialog и пока крутится индикатор, строился бы интерфейс
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pablito
2410 / 1855 / 581
Регистрация: 12.05.2014
Сообщений: 6,591
Завершенные тесты: 1
27.03.2015, 14:07     Как показать ProgressDialog при долгом построении UI? #2
у людей обычно так и происходит - после нажатия кнопки в первом активити, сразу показывается вторая активити сразу с интерфейсом
а если там надо что-то много считать то делай это до того, как первая активити запустит вторую

хотя что там такого можно считать такого сложного что задержка получается долгая?
ChewbaccaCyber
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 13
27.03.2015, 14:38  [ТС]     Как показать ProgressDialog при долгом построении UI? #3
хотя что там такого можно считать такого сложного что задержка получается долгая?
Вычисляется количество, размер и взаимное расположение большого количества TextView и других элементов интерфеса
Pablito
2410 / 1855 / 581
Регистрация: 12.05.2014
Сообщений: 6,591
Завершенные тесты: 1
27.03.2015, 14:40     Как показать ProgressDialog при долгом построении UI? #4
значит криво вычисляются если это занимает значительное время
сколько их, сотни-тысячи?
YuraAAA
1565 / 1307 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
27.03.2015, 15:01     Как показать ProgressDialog при долгом построении UI? #5
Мне кажется, какое-то архитектурное решение неправильное Вы выбрали
ChewbaccaCyber
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 13
27.03.2015, 15:32  [ТС]     Как показать ProgressDialog при долгом построении UI? #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 никогда не показывается, а продолжительное время виден чёрный экран, а потом сразу готовая активити
Pablito
2410 / 1855 / 581
Регистрация: 12.05.2014
Сообщений: 6,591
Завершенные тесты: 1
27.03.2015, 15:37     Как показать ProgressDialog при долгом построении UI? #7
что мешает все это делать в отдельном потоке и не открывать вторую активити пока не посчитает?
а прогресс показывать в первой
ChewbaccaCyber
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 13
27.03.2015, 15:43  [ТС]     Как показать ProgressDialog при долгом построении UI? #8
Мешает то, что из doInBackground нельзя обращаться к UI и у меня происходит исключение на строчке layoutItems.addView(txtLetter);
Pablito
2410 / 1855 / 581
Регистрация: 12.05.2014
Сообщений: 6,591
Завершенные тесты: 1
27.03.2015, 15:54     Как показать ProgressDialog при долгом построении UI? #9
полезно посмотреть https://developer.android.com/refere...AsyncTask.html
а если своими словами то прямо из doInBackground нужно вызывать publishProgress(...)
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
27.03.2015, 16:35     Как показать ProgressDialog при долгом построении UI? #10
для вас идеальное решение выводить вычисления в отдельный поток, AsyncTask.

И по ходу выполнения вызывать из doInBackground (основной метод потока) publishProgress(value);
тогда некое значение будет передаваться в метод onProgressUpdate, который уже выполняется в UI потоке. там можно образаться к прогресбару какому-нибудь, и вообще делать все что вам нужно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2015, 16:46     Как показать ProgressDialog при долгом построении UI?
Еще ссылки по теме:
Android Ожидание подключения к серверу (ProgressDialog)
Android ProgressDialog upload fpt server
Intellij Idea 13, ошибка при построении проекта : Unable to execute DX Android
Android Последовательное выполнение Async Tasks и progressdialog
ProgressDialog во время динамического создания View Android

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

Или воспользуйтесь поиском по форуму:
YuraAAA
1565 / 1307 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
27.03.2015, 16:46     Как показать ProgressDialog при долгом построении UI? #11
ChewbaccaCyber, onPreExecute() показываем диалог, onPostExecute() скрываем
Yandex
Объявления
27.03.2015, 16:46     Как показать ProgressDialog при долгом построении UI?
Ответ Создать тему
Опции темы

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