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 不显示的主要内容,如果未能解决你的问题,请参考以下文章

Android:ProgressDialog 不显示

Android 强制关闭 ProgressDialog

使用自定义 ProgressDialog android

Android 进度条对话框ProgressDialog

AsyncTask Android 关闭 ProgressDialog

android中AsyncTask中的ProgressDialog