Показать диалог вращающегося колеса при загрузке данных на 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");
}
}
Ответы
Ответ 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();