在Android上加载数据时显示旋转轮对话框

我想显示一个旋转轮对话框,而我的应用程序加载一些数据:

转轮对话框

旋转轮对话框应该点击button显示。 我正在使用下面的代码,但它现在显示的是转轮。 可能是什么问题呢?

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

Solutions Collecting From Web of "在Android上加载数据时显示旋转轮对话框"

所以,看到这个答案越来越多,我决定自己去提高答案的质量。 当我看到原文的时候,我没有看到“我的代码中有什么问题?”这个问题的真正答案。 我在下面保留原来的答案以保持链接,这正是我所假设的引起答案的stream行。

更新的答案

您很可能违反了“单线程模式”。 Android UI工具包不是线程安全的,只能从“主”UI线程操纵。 Android有一些有用的方法可以用来确保UI操作在UI线程上完成。 这些方法调用的大部分细节可以在Android Painless Threading博客文章中find(链接在下面的单词“one”中,以供快速参考)。

看看你的代码,我看到的具体违规行为是ProgressDialog正在被创build的UI线程,然后在新创build的后台线程中被解散。

你最好把你的背景方法封装在一个Runnable并使用View#post(Runnable)在后台执行这个工作。

请记住,有很多方法可以做背景,所以请看看可用的内容,并使用适合您的情况的内容。

原始答复

看看如何在Android中进行asynchronous 工作的许多 教程之一。

另外,这里还有一些类似的其他StackOverflow问题

Android中的进度对话框问题

进度对话框打开活动

进度对话框,同时开始新的活动

Android:进度对话框微调不旋转

更新进度对话框

android:显示进度对话框

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

我有两个活动,活动A和活动B之间切换的问题。活动B有长期运行的任务更新用户界面,所以它不是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();