Показывать диалог прялки при загрузке данных на Android - PullRequest
38 голосов
/ 28 мая 2011

Я хочу показать диалог прялки, пока мое приложение загружает некоторые данные:

Spinning wheel dialog

Диалог вращающегося колеса должен отображаться при нажатии кнопки. Я использую код ниже, но теперь он показывает вращающееся колесо. В чем может быть проблема?

public void CheckAccount(String username, String password) {
    try {

        final ProgressDialog progDailog = ProgressDialog.show(this,
            "Progress_bar or give anything you want",
            "Give message like ....please wait....", true);
        new Thread() {
            public void run() {
                try {
                    // sleep the thread, whatever time you want. 
                    sleep(1000);
                } catch (Exception e) {
                }
                progDailog.dismiss();
            }
        }.start();

        //getting data code here
        //getting data code here
        //getting data code here
        //getting data code here
        //getting data code here

    } catch (Exception e) {
        Log.e(LOG_TAG, e.getMessage());
        PopIt("CheckAccountError", e.getMessage(), "Denied");
    }
}

Ответы [ 3 ]

49 голосов
/ 28 мая 2011

Итак, видя, что этот ответ получает все больше и больше голосов, я решил, что должен взять это на себя, чтобы улучшить качество ответа.Когда я смотрю на оригинал, я не вижу реального «ответа» на вопрос «в чем проблема в моем коде?».Я оставляю исходный ответ без изменений ниже, чтобы сохранить связь, что, как я предполагаю, вызвало популярность ответов.

Обновленный ответ

Вероятно, вы нарушаете «однопоточную модель».Android UI Toolkit не является потокобезопасным, и им следует манипулировать только из «основного» потока пользовательского интерфейса.В Android есть несколько полезных методов, которые вы можете использовать, чтобы убедиться, что ваши пользовательские операции выполняются в потоке пользовательского интерфейса.Большинство деталей об этих вызовах методов можно найти в сообщении блога Android Painless Threading (ссылка на которое содержится в слове «один» ниже, и здесь для быстрого ознакомления).

Просмотр вашегокод, конкретное нарушение, которое я вижу, заключается в том, что ProgressDialog создается в том, что, скорее всего, поток пользовательского интерфейса, который затем отклоняется во вновь созданном фоновом потоке.

Вы бы лучше инкапсулировали свой фоновый методв Runnable и использовании View#post(Runnable) для выполнения работы в фоновом режиме.

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

Оригинальный ответ

Взгляните на один из многих учебников о том, как сделать асинхронных работы в Android .

Кроме того, вот некоторые другие вопросы StackOverflow, которые похожи

Progress diaпроблема с журналом в Android

Диалог хода выполнения при открытой активности

Диалог хода выполнения при запуске новой операции

Android: спиннер Progress Dialog не вращается

Обновление диалогового окна прогресса

android: отображение диалога прогресса

40 голосов
/ 20 февраля 2015

Создать.

ProgressDialog dialog = new ProgressDialog(this); // this = YourActivity
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setTitle("Loading");
dialog.setMessage("Loading. Please wait...");
dialog.setIndeterminate(true);
dialog.setCanceledOnTouchOutside(false);

Показать.

dialog.show();

Уволить.

dialog.dismiss();
1 голос
/ 15 декабря 2015

У меня была проблема переключения между двумя действиями, Упражнением A и Упражнением B. На занятии B выполнялись долго выполняющиеся задачи, которые обновляли пользовательский интерфейс, поэтому он не был кандидатом в AsyncTask.Я решил это, запустив диалоговое окно «Ход выполнения» для «Действия А» и запустив «Деятельность В», прежде чем мы закончили первое действие.Код выглядит так:

            // wrap thread around original code for progress button
            final ProgressDialog ringProgressDialog = ProgressDialog.show(getActivity(), "Working", "Please Wait",
                    true, false);
            ringProgressDialog.setIndeterminate(true);
            new Thread(new Runnable() {
                public void run() {
                    try {

                        Intent startNewActivityOpen = new Intent(getActivity(), ActivityB.class);
                        startNewActivityOpen.setFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
                        startActivity(startNewActivityOpen);
                        GlobalVars.navigateFromScreen = true;

                        Thread.sleep(3000);


                        if (ringProgressDialog != null && ringProgressDialog.isShowing()) {
                            ringProgressDialog.dismiss();
                        }

                        getActivity().finish();


                    } catch (Exception e) {

                    }

                }

            }).start();
...