无限循环线程导致UI冻结

时间:2016-07-22 14:34:51

标签: android multithreading

我有一个必须不断更新的UI组件。我尝试将更新过程添加到UI线程,如下所示:

getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
                while(true) {
                    speedometer.setValue((int) speed);
                }

        }
    });

但这导致应用程序冻结。为什么会这样?

2 个答案:

答案 0 :(得分:0)

getActivity().runOnUiThread引起的问题基本上说“在主UI线程中执行内部运行功能。”

使用下一个代码在活动内部而不是在UI线程上创建新线程。

Thread thread = new Thread() {
    @Override
    public void run() {
        try {
            while(true) {
                speedometer.setValue((int) speed);
                handler.post(this);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

thread.start();

答案 1 :(得分:0)

你不想在UI线程上运行它 - 它会永远阻止。您在UI线程上运行无限循环,从而阻止它执行任何其他工作。实际上需要在UI线程上运行的唯一部分是实际更新UI本身的部分。让它在后台线程上运行,只在您实际进行更新时调用RunOnUIThread。

顺便说一下,你为什么要连续做这个过程? (如果我没记错的话,你可以在大约20毫秒左右的时间内逃脱它对人眼的感知,所以没有必要经常进行更新。