0

我想在 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();
}

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

4

3 回答 3

3

您正在调用sleep(). UI Thread不要这样做。使用runOnUiThreadAsyncTask

无痛穿线

异步任务

我会使用一个AsyncTask. 您将启动ProgressDialoginonPreExecute()然后将其关闭onPostExecute()。它是一个UI元素,所以使用它doInBackground()会给你错误

这个 SO answer 有一个很好的使用例子

于 2013-04-17T18:56:53.430 回答
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 毫秒

这是坏事。

地方

我不知道为什么

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

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

super.onCreate(savedInstanceState);
于 2013-04-17T18:59:49.370 回答
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();
于 2013-04-17T19:24:11.087 回答