无法关闭Android中的进度对话框

时间:2013-04-17 18:48:30

标签: java android mobile dialog progress

我想在android中创建一个进度对话框,让它打开2秒然后关闭它。

以下是我写的代码:

package com.example.proressdialogtest;

import android.app.activity;
import android.app.ProgressDialog;
import android.os.bundle;

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState); 
        ProgressDialog pg = new ProgressDialog(MainActivity.this, 4);

        pg.show(MainActivity.this, null, "Searching...", false);

        try {
            Thread.sleep(2000);
        } catch (Exception e) {
            e.printStackTrace();
        }  

        pg.dismiss();
}

当我在设备上运行代码时,会打开ProgressDialog,然后它会保持打开状态,2秒后它不会关闭。我做错了什么?


根据以下答案。我分别在doInBackground方法之前和之后添加了onPreExecute()和onPostExecute()方法。

以下是两种方法的代码。

ProgressDialog pd;

public void onPreExceute() {
    pd = new ProgressDialog(MainActivity.this);
    pd.show(MainActivity.this, "", "Searching...", false);
}

public void onPostExecute() {
    pd.dismiss();
}

问题仍然存在。进度条不会关闭。

3 个答案:

答案 0 :(得分:3)

您正在sleep()上致电UI Thread。不要这样做。使用runOnUiThreadAsyncTask

Painless Threading

AsyncTask

我会使用AsyncTask。您将在ProgressDialog中启动onPreExecute(),然后在onPostExecute()中将其关闭。它是UI元素,因此在doInBackground()中使用它会给您带来错误

<强> This SO answer has a good example of using it

答案 1 :(得分:1)

修改

使用此代码

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        final ProgressDialog pg ;

      pg =  ProgressDialog.show(MainActivity.this, null, "Searching...", false);

        Thread timer=new Thread(){
            public void run()
            {
                try {
                    sleep(2000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                finally{
                     pg.dismiss();
                }
            }

        };
        timer.start();
}
}

您正在通过调用

暂停UI线程
 Thread.sleep(2000);

因为Thread.sleep(x)会使当前线程休眠x毫秒

这是件坏事。

地点

我不知道为什么

pg.dismiss()在finally块中,以确保关闭进度对话框。

  

而且你的代码也不会运行,因为你错过了

super.onCreate(savedInstanceState);

答案 2 :(得分:0)

以下代码适合您,

 new AsyncTask<Integer, Integer, Boolean>()
             {
                 ProgressDialog progressDialog = null;

                 @Override
                 protected void onPreExecute()
                 {                         
                     progressDialog = ProgressDialog.show(MainActivity.this, "",
                             "Loading...");
                 }

                 @Override
                 protected Boolean doInBackground(Integer... params)
                 {
                     if (params == null)
                     {
                         return false;
                     }
                     try
                     {

                         Thread.sleep(2000);

                     }
                     catch (Exception e)
                     {

                         return false;
                     }

                     return true;
                 }

                 @Override
                 protected void onPostExecute(Boolean result)
                 {
                     progressDialog.dismiss();                        

                 }
             }.execute();