在另一个线程中访问UI视图不会导致崩溃.为什么?



全部:

我真的还没有找到经纪人。我认为下面的代码——经过修改,可以直接访问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);
                    }
                });
            }

如今,ProgressBar具有允许在后台线程上调用setProgress()的逻辑。它检查您所在的线程,并在需要时执行Runnablepost()。您可以在源代码中看到这一点。

相关内容

  • 没有找到相关文章

最新更新