Android:ProgressDialog不显示

Sel*_*t0r 38 android progressdialog android-context

我正在尝试为Android-App创建一个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();
Run Code Online (Sandbox Code Playgroud)

我也试过添加pd.show();和搞乱参数,new ProgressDialog导致什么都没有(除了所选参数不起作用的错误),这意味着:ProgressDialog永远不会出现.应用程序只是保持运行,就好像我从未添加过对话框一样.

我不知道我是否在正确的地方创建了对话框,我把它移动了一下但是,这也没有帮助.也许我在错误的背景下?上面的代码是内部private ViewGroup _createInputForm()MyApp.

任何提示都表示赞赏,

Rof*_*ion 42

你必须在长计算开始之前调用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();
    }
Run Code Online (Sandbox Code Playgroud)

这里线程:

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();
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

  • 只是为了完成这个,以防有人感兴趣:ProgressDialog的"闪烁"只发生在模拟器中,它不会发生在实际设备上.看起来模拟器在实际处理请求(onClick)之前需要几秒钟才会停止,并且应用程序会冻结直到发生这种情况.在设备上,每个人都可以. (3认同)
  • 为什么我们不使用pd = new ProgressDialog(this); pd.show();? (2认同)
  • 您也可以调用稍微更清晰的runOnUiThread而不是处理程序. (2认同)

小智 25

我给你一个解决方案,尝试这个...首先在onCreate()方法之前的Activity中定义进度对话框

private ProgressDialog progressDialog;
Run Code Online (Sandbox Code Playgroud)

现在,在onCreate方法中,您可以单击任何按钮,您将更改任何操作的活动.只需在那里设置进度条.

progressDialog = ProgressDialog.show(FoodDriveModule.this, "", "Loading...");
Run Code Online (Sandbox Code Playgroud)

现在使用线程来处理要显示和隐藏的进度条

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();
Run Code Online (Sandbox Code Playgroud)

就这些!