Android 上的 runOnUiThread() 和无限循环

runOnUiThread() and infinite loop on Android

我不明白我的代码的行为。总而言之,我有一个以“00”开头的editText(我的代码中的可变时间)。我正在创建一个线程来防止此 editText 没有 2 位数。假设此 editText 不能超过 2 位数字。我正在做的是创建一个线程。在这个线程中,每当这个 editText 没有 2 位数字(所以 1 位数字)时,我都会向它添加一个“0”。

但是,每当我只在 editText 上输入一个数字时,它就会变得疯狂并进入无限循环和其他我不明白的东西。这是我的代码:

Thread digitLessThanTwoThread;
EditText hours = (EditText) findViewById(R.id.hours);
digitLessThanTwoThread= new Thread(){
            @Override
            public void run()
            {
                while(true) {
                    if (hours.getText().toString().length() != 2 && !hours.isFocused()) {
                        main_activity.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                hours.setText("0" + hours.getText().toString());
                            }
                        });
                    }
                }
            }
        };
        digitLessThanTwoThread.start();

此外,最后,editText 小时数显示为“00”。 在实际执行任何操作之前,我还会收到一条消息 "suspending all threads took: XXX seconds"!

这里有两个问题。一、简单的:

while(true)

这将使线程 运行 处于全功率状态,直到您似乎注意到,OS 介入以停止 运行 离开线程。例如,您应该添加一个 addTextChangedListener() 侦听器。

比较复杂的是:

main_activity.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        hours.setText("0" + hours.getText().toString());
    }
});

我认为您假设这是同步执行的,即 setText()runOnUiThread() returns 之前执行。然而,它是异步的,所以下一次循环你的 if 仍然是真的,你在 UI 线程上排队另一个动作来设置文本等等,所以 UI在 OS 介入以停止 运行 离开线程之前,线程可能永远没有机会 运行。