0

アンドロが私に書いたように、コードを更新しました。

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

これはとても簡単です。この背後にある基本的な事実は次のとおりです。

進行状況ダイアログはメインUIで実行されます。ここでのループはすぐに実行され、優先順位が高くなるため、進行状況ダイアログを表示できませforんが、実際には、コードは正常に機能し、進行状況ダイアログは人間の目では捉えられない数秒間表示されます。

通常、メインスレッドではなく、バックグラウンドスレッドで何かを行うときに、進行状況ダイアログを使用します。したがって、コードを少し変更する必要があります。彼らです、

for1)ループを次のようなスレッドで囲みます。

    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 に答える
1

あなたのコードは、次のようにするのと同じです。

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

メソッドが呼び出されますが、ループに時間がまったくかからないshowため、すぐにダイアログが閉じられます。forさらに、UI をブロックしています。したがって、空の for ループを時間のかかる操作で置き換えると、UI スレッドがブロックされるため、進行状況が実行されなくなります。

于 2012-04-10T20:33:58.370 に答える