2010-05-09 143 views
35

我试图创建一个Android应用程序一个ProgressDialog(只是一个简单的展示的东西正在发生的事情,没有任何按键或任何用户),但我无法得到它的权利。我已经通过论坛和教程以及SDK附带的示例代码,但无济于事。安卓:ProgressDialog不显示

这是我得到:

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不会出现。该应用程序只是继续运行,就好像我从来没有添加对话框。

如果我在正确的地方创建对话框我不知道,我把它绕了一下但也didnt't帮助。也许我处在错误的环境中?以上代码在private ViewGroup _createInputForm()MyApp之内。

任何暗示表示赞赏,

回答

39

你有很长的计算开始前致电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(); 
      } 
     }; 
    } 
+0

我已经重建了我的应用程序来完成这项工作:)我阅读的教程听起来像这样是可能的没有另一个线程,但你永远不会停止学习。我没有完全完成:现在ProgressDialog没有显示它应该在哪里(至少它显示!),但在结果出现之前不久就“闪烁”,但现在我认为我可以自己完成剩下的工作; ) 非常感谢你的帮助! – Select0r 2010-05-09 20:51:29

+2

只是为了完成这一点,以防有人感兴趣:ProgressDialog的“闪烁”是仅在仿真器中发生的事情,它不会在实际设备上发生。看起来,仿真器在请求(onClick)实际处理之前花费了很长时间,应用程序冻结直到发生这种情况。在设备上,一切都好。 – Select0r 2010-05-11 07:37:02

+2

为什么我们不使用pd = new ProgressDialog(this); pd.show();? – Emerald214 2011-07-04 14:55:00

24

我给你这一个解决方案, 试试这个.... 第一的onCreate之前定义进度对话框中的活动()方法。

私人ProgressDialog progressDialog;

现在,在onCreate方法你可能有任何按钮,点击其中U将改变任何操作Activit。只需在那里设置进度栏。

progressDialog = ProgressDialog.show(FoodDriveModule.this, "", "Loading..."); 

现在使用线程Hamndle进度条来显示和隐藏

new Thread() 
{ 
    public void run() 
    { 

    try 
     { 
     sleep(1500); 

    // do the background process or any work that takes time to see progreaa dialog 

     } 
    catch (Exception e) 
    { 
     Log.e("tag",e.getMessage()); 
    } 
// dismiss the progressdialog 
    progressDialog.dismiss(); 
} 
}.start(); 

这就是所有!

+0

它完全显示progressDialog。但是我的情况有点不同。我想在从一个应用程序切换到另一个应用程序时显示progressDialog,并希望避免中断。可能吗? – YuDroid 2012-05-23 13:25:33

3

这也可以通过使用AsyncTask。这门课为你创建一个线程。您应该继承它并填写doInBackground(...)方法。

4

进度对话框不显示,因为你必须使用一个独立的线程。 Android中的最佳做法是使用AsyncTask(强烈推荐)。 另请参阅此answer