0

我更新了我的代码,就像 Andro 写给我的一样:

public class ZiiziiActivity extends Activity {
    ProgressDialog pd;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        pd = new ProgressDialog(ZiiziiActivity.this);
        final Handler handler = new Handler()
        {
            public void handleMessage(Message msg)
            {
                if(msg.what==0)
                {
                    pd.dismiss();
                }
            }
        };

        Button end = (Button) findViewById(R.id.button2);
        end.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                pd.setMessage("Working...");
                pd.setIndeterminate(true);
                pd.setCancelable(false);
                pd.show();
                Thread t = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for (int i=0;i<1000000;i++)
                        {
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } //To denote a delay in background processing
                        }
                        handler.sendEmptyMessage(0);
                    }
                }); t.start();
            }
        });
    }
}

但是,当进步开始时,它永远不会结束。

有什么问题?

4

2 回答 2

1

您的代码与您将执行以下操作相同。

pd.show();
pd.dismiss();

该方法show被调用,但对话框将立即被关闭,因为您的for循环根本没有时间消耗。此外,您正在阻止 UI。因此,如果您通过耗时的操作替换空的 for 循环,您的进度将不会运行,因为您阻塞了 UI 线程。

于 2012-04-10T20:33:58.370 回答
1

这很简单。这背后的基本事实如下。

您的进度对话框在主 UI 中运行。您的for循环在这里执行得如此之快并且具有更高的优先级,因此您无法看到您的进度对话框,但事实是,您的代码工作正常并且进度对话框确实显示了人眼无法捕捉的几分之一秒。

通常人们在后台线程而不是主线程中执行某些操作时会使用进度对话框。因此,您将不得不更改一些代码。他们是,

1)用这样的线围绕你的for循环,

    Button end = (Button) findViewById(R.id.button2);
    end.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View v)
        {
            ProgressDialog pd = new ProgressDialog(ZiiziiActivity.this);
            pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pd.setMessage("Working...");
            pd.setIndeterminate(true);
            pd.setCancelable(false);
            pd.show();
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i=0;i<1000000;i++)
                    {
                        Thread.sleep(100); //To denote a delay in background processing
                    }
                    handler.sendEmptyMessage(0);
                }
            });
            t.start();
        }
    });

2) 现在向你的 onCreate() 添加一个处理程序,如下所示:

    handler = new Handler()
    {
        public void handleMessage(Message msg)
        {
            if (msg.what == 0)
            {
                pd.dismiss();
            }
        };

请注意,您不能从后台线程更新您的 UI。因此,为了从其他工作线程更新 UI,您需要使用处理程序。因此,一旦您的 for 循环完成,将调用更新 UI 的处理程序。(在这种情况下,它会取消进度对话框)。

于 2012-04-11T06:44:23.963 回答