2

全て:

私はまだハンドラーを理解していません。ハンドラーを使用する代わりに、UI ウィジェット (進行状況バー) に直接アクセスするように変更した以下のコードは、クロススレッド例外を引き起こすと考えました。しかし、そうではありません。それで、私の質問は、このコードがクラッシュするべきではないということです? そうでない場合、いつハンドラーを使用する必要がありますか?

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        progress = 0;
        progressBar = (ProgressBar) findViewById(R.id.progressbar);
        progressBar.setMax(200);

        //---do some work in background thread---
        new Thread(new Runnable()
        {
            public void run()
            {
                //ó-do some work hereó-
                while (progressStatus < 200)
                {
                    progressStatus = doSomeWork();
                    progressBar.setProgress(progressStatus); // not on UI thread
                    //ó-Update the progress baró-            // so shouldn't it crash?
//                    handler.post(new Runnable()
//                    {
//                        public void run() {
//                            progressBar.setProgress(progressStatus);
//                        }
//                    });
                }

                //---hides the progress bar---
                handler.post(new Runnable()
                {
                    public void run()
                    {
                        //---0 - VISIBLE; 4 - INVISIBLE; 8 - GONE---
                        progressBar.setVisibility(View.GONE);
                    }
                });
            }
4

1 に答える 1

6

最近では、バックグラウンド スレッドで呼び出すProgressBarことができるロジックがあります。setProgress()現在のスレッドを確認し、必要に応じて独自post()の a を実行しRunnableます。これはソース コードで確認できます。

于 2013-01-08T17:41:47.347 に答える