我想在我的应用加载一些数据时显示一个旋转轮对话框:
点击按钮时应显示旋转轮对话框。我正在使用下面的代码,但它现在显示了旋转轮。可能是什么问题?
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");
}
}
答案 0 :(得分:49)
所以,看到这个答案越来越受欢迎,我决定自己应该自己提高答案的质量。当我看到原文时,我看不到“我的代码中的问题是什么?”这个问题没有真正的“答案”。我将原始答案保留在下面,以保留链接,这是我假设已经导致答案流行。
更新了答案
您可能违反了“单线程模型”。 Android UI Toolkit不是线程安全的,只能从“主”UI线程进行操作。 Android有一些有用的方法可用于确保您的UI操作在UI线程上完成。这些方法调用的大多数细节都可以在Android无痛线程博客文章中找到(链接在下面的'one'和here中以便快速参考)。
查看您的代码,我看到的具体违规是在可能的UI线程中创建ProgressDialog
,然后在新创建的后台线程中将其解除。
最好将您的背景方法封装在Runnable
中并使用View#post(Runnable)
在后台完成工作。
请记住,有很多方法可以做背景,所以看一下可用的方法,并使用适合您情况的方法。
原始答案
look one many tutorials asynchronous work Android Progress dialog problem in Android Progress Dialog on open activity。 / p>
此外,这里有一些类似的其他StackOverflow问题
Progress Dialog while starting new activity
Android: Progress Dialog spinner not spinning
android: showing a progress dialog
{{3}}
{{3}}
答案 1 :(得分:40)
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();
答案 2 :(得分:1)
我遇到了在两个活动(活动A和活动B)之间切换的问题。活动B有长时间运行的任务正在更新UI,所以它不是AsyncTask的候选者。我通过在活动A上启动进度对话框并在完成第一个活动之前启动活动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();