Подтвердить что ты не робот

Показать диалог вращающегося колеса при загрузке данных на Android

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

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");
    }
}
4b9b3361

Ответ 1

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

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

Вероятно, вы нарушаете "модель одного потока". Инструмент Android UI Toolkit не является потокобезопасным, и его следует использовать только из "основного" потока пользовательского интерфейса. У Android есть несколько полезных методов, которые вы можете использовать для обеспечения того, чтобы ваши пользовательские интерфейсы выполнялись в потоке пользовательского интерфейса. Большинство подробностей этих вызовов методов можно найти в блоге блога Android "Безболезненный поток" (связанный в слове "один" ниже, и здесь для быстрой справки).

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

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

Помните, что есть много способов сделать фон, поэтому взгляните на то, что доступно, и используйте то, что вам подходит.

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

Возьмите посмотреть в один из many учебники о том, как это сделать асинхронный work в Android.

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

Проблема с диалоговым окном в Android

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

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

Android: ускоритель Progress Dialog не вращается

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

android: показ диалога прогресса

Ответ 2

Создавать.

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();

Ответ 3

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

            // 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();