Android - 进度条上非常奇怪的行为

时间:2012-04-10 20:21:48

标签: android

我更新了我的代码,就像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();
            }
        });
    }
}

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

有什么不对?

2 个答案:

答案 0 :(得分:1)

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

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

调用方法show,但会立即取消对话框,因为for循环根本不是时间消耗。此外,您正在阻止UI。因此,如果通过耗时的操作替换空for循环,则因为阻止UI线程而无法运行进度。

答案 1 :(得分: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的处理程序。 (在这种情况下,它会取消进度对话框)。