提问者:小点点

当在用户界面线程上运行时,主线程从普通线程(非用户界面)调用时做什么?


我注意到主循环器在动画期间被调用,如果用户界面线程正在做一些劳动密集型的事情,则跳过一些动画。解决此问题的一种方法是运行线程或runnable或callable,然后它们在用户界面线程上加入(自动为callable,手动通过调用run on用户界面线程)。

但是这是否意味着用户界面线程可能会在其他线程重要的事情中中断?即如果其他线程返回一些数据,但用户界面正在处理旧数据。

简而言之:主线程将完成它正在做的事情并且不会被中断,另一个线程将在主线程上发布一个包含新数据的runnable并继续做其他事情(如果有的话),最终主线程将运行包含来自另一个线程的新数据的runnable。


共2个答案

匿名用户

runOnUiThread()的工作原理如下

在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将该操作发布到UI线程的事件队列中。

因此,通过使用您发布的场景来理解它,它的工作原理类似于,主线程将执行它正在使用的当前事件,并将您的事件添加到UI线程的事件队列中。

匿名用户

试试这个:-

runOnUiThread (new Thread(new Runnable() {  
        public void run() {
            while(i++ < 1000){
                btn.setText("#"+i);
                try {
                    Thread.sleep(300);
                } 
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
         }
    }));