在另一个线程访问UI视图值不一定导致崩溃。 为什么?(Accessing UI view in

2019-08-06 01:52发布

所有:

我真的不神交处理呢。 我认为下面的代码 - 修改,使得而是采用了处理,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);
                    }
                });
            }

Answer 1:

如今, ProgressBar具有逻辑,允许setProgress()到在后台线程中调用。 它检查看看你是什么的线程并执行自己的post()一个的Runnable如果需要的话。 你可以看到这个源代码 。



文章来源: Accessing UI view in another thread does *not* cause a crash. Why?