返回

高谈阔论,子线程能否更新 UI?破解 Bug 背后的误解

Android

误解:子线程不能更新 UI

初学者常被教导“只有主线程能更新 UI”,导致他们认为子线程根本无法更新 UI。实际上,在 Android 中,子线程也可以更新 UI,只要遵循一些规则即可。

规则一:使用 Handler 或 Looper

子线程要更新 UI,必须通过 Handler 或 Looper 来完成。Handler 可以将消息发送到主线程,主线程再将消息处理后更新 UI。Looper 则是一个消息循环,它不断轮询并处理消息。

规则二:只更新非 View 的 UI 元素

子线程只能更新非 View 的 UI 元素,比如 TextView 的 text 属性。如果要更新 View 的属性,比如 View 的位置或大小,则必须在主线程中进行。

误解:子线程更新 UI 效率低下

有些人认为子线程更新 UI 会导致性能问题。实际上,如果正确使用 Handler 或 Looper,子线程更新 UI的效率并不比主线程差。

小结

子线程可以更新 UI,但需要遵守一定的规则。否则,就会出现“只有主线程能更新 UI”的异常。希望这篇文章能帮助大家破解这个 Bug 背后的误解。

示例代码

public class MainActivity extends Activity {
    private Handler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mHandler = new Handler();

        // 在子线程中更新 UI
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 使用 Handler 将消息发送到主线程
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        // 在主线程中更新 UI
                        TextView textView = findViewById(R.id.text_view);
                        textView.setText("子线程更新 UI 成功!");
                    }
                });
            }
        }).start();
    }
}

结语

希望这篇文章对您有所帮助。如果您有其他问题,欢迎随时提问。