Android:ProgressDialog 不显示
Posted
技术标签:
【中文标题】Android:ProgressDialog 不显示【英文标题】:Android: ProgressDialog doesn't show 【发布时间】:2011-02-17 09:54:27 【问题描述】:我正在尝试为 android 应用程序创建一个 ProgressDialog(只是一个简单的向用户显示正在发生的事情,没有按钮或任何东西),但我做错了。我浏览过论坛和教程以及 SDK 附带的示例代码,但无济于事。
这是我得到的:
btnSubmit.setOnClickListener(new View.OnClickListener()
public void onClick(View view)
(...)
ProgressDialog pd = new ProgressDialog(MyApp.this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("Working...");
pd.setIndeterminate(true);
pd.setCancelable(false);
// now fetch the results
(...long time calculations here...)
// remove progress dialog
pd.dismiss();
我还尝试添加 pd.show();
并弄乱了 new ProgressDialog
中的参数,结果一无所获(除了所选参数不起作用的错误),这意味着:ProgressDialog 永远不会出现.该应用程序一直在运行,就好像我从未添加过对话框一样。
我不知道我是否在正确的位置创建对话框,我将它移动了一点,但这也没有帮助。也许我在错误的上下文中?上面的代码在private ViewGroup _createInputForm()
里面MyApp
里面。
感谢任何提示,
【问题讨论】:
【参考方案1】:您必须在长计算开始之前调用 pd.show,然后计算必须在单独的线程中运行。一旦这个线程完成,你必须调用 pd.dismiss() 来关闭 prgoress 对话框。
这里你可以看到一个例子:
progressdialog 被创建并显示,并调用一个线程来运行一个繁重的计算:
@Override
public void onClick(View v)
pd = ProgressDialog.show(lexs, "Search", "Searching...", true, false);
Search search = new Search( ... );
SearchThread searchThread = new SearchThread(search);
searchThread.start();
这里是线程:
private class SearchThread extends Thread
private Search search;
public SearchThread(Search search)
this.search = search;
@Override
public void run()
search.search();
handler.sendEmptyMessage(0);
private Handler handler = new Handler()
@Override
public void handleMessage(Message msg)
displaySearchResults(search);
pd.dismiss();
;
【讨论】:
我已经重建了我的应用程序来完成这项工作 :) 我阅读的教程听起来好像没有其他线程也可以,但你永远不会停止学习。我还没有完全完成:现在 ProgressDialog 没有显示它应该显示的位置(至少它显示了!),而只是在结果出现前不久“闪烁”,但现在我想我可以自己完成剩下的; ) 非常感谢您的帮助! 只是为了完成这个,以防有人感兴趣:ProgressDialog 的“闪烁”只发生在模拟器中,它不会发生在实际设备上。在实际处理请求(onClick)之前,模拟器似乎需要很长时间,并且应用程序会冻结,直到发生这种情况。在设备上,一切正常。 你也可以调用runOnUiThread而不是处理程序,这会更清晰。 嘿 Roflcopter.. 我对你给出的这个灵魂的问题是我的线程处理在一个单独的类中。这是我的第一个类,它具有所有 UI 通过一个对象调用线程类并执行它等待一些 HTTP 结果......现在我的 pd.show() 将必须在显示 UI 的类中,但正如您的解决方案所说.. pd.dismiss() 应该在实际工作的方法中,在工作完成之后......但这对我来说是不可能的......是否有任何替代解决方案可能?我尝试在收到结果的行之后调用 pd.dismiss() 但仍然没有运气 @thanks RoflcoptrException 这对你真的很有帮助 +1 :)【参考方案2】:我正在给你一个解决方案,
尝试这个...
先在onCreate()
方法之前的Activity中定义Progress Dialog
private ProgressDialog progressDialog;
现在在onCreate
方法中,您可能会单击任何按钮,您将在任何操作上更改活动。只需在此处设置进度条即可。
progressDialog = ProgressDialog.show(FoodDriveModule.this, "", "Loading...");
现在使用线程来处理进度条的显示和隐藏
new Thread()
public void run()
try
sleep(1500);
// do the background process or any work that takes time to see progress dialog
catch (Exception e)
Log.e("tag",e.getMessage());
// dismiss the progress dialog
progressDialog.dismiss();
.start();
就是这样!
【讨论】:
完美显示progressDialog。但我的情况略有不同。我想在从一个应用程序切换到另一个应用程序时显示 progressDialog 并希望避免停电。有可能吗? 这给了我一个错误Only the original thread that created a view hierarchy can touch its views.
请参阅***.com/questions/5161951/…【参考方案3】:
进度对话框不显示,因为您必须使用单独的线程。 Android 中的最佳实践是使用AsyncTask(强烈推荐)。 另请参阅answer。
【讨论】:
【参考方案4】:这也可以通过使用AsyncTask 来实现。此类为您创建一个线程。您应该对其进行子类化并填写doInBackground(...)
方法。
【讨论】:
以上是关于Android:ProgressDialog 不显示的主要内容,如果未能解决你的问题,请参考以下文章