Java Android上的runOnUiThread()和无限循环

Java Android上的runOnUiThread()和无限循环,java,multithreading,android-runonuithread,Java,Multithreading,Android Runonuithread,我不理解我的代码的行为。总而言之,我有一个以“00”开头的editText(代码中的小时数可变)。我正在创建一个线程,以防止此editText没有2位数字。假设此editText的位数不能超过2位。我所做的是创建一个线程。在这个线程中,每当这个editText没有2个数字(所以是1个数字)时,我就向它添加一个“0” 然而,每当我在编辑文本上加上一个数字,它就会变得疯狂,进入无限循环和其他我不理解的东西。这是我的密码: Thread digitLessThanTwoThread; EditText

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

然而,每当我在编辑文本上加上一个数字,它就会变得疯狂,进入无限循环和其他我不理解的东西。这是我的密码:

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”。
在实际执行任何操作之前,我还收到一条消息“暂停所有线程花费了:XXX秒”

这里有两个问题。首先,简单一点:

while(true)
这将以最大功率运行线程,直到您注意到,操作系统介入以停止失控的线程。例如,您应该添加一个
addTextChangedListener()
监听器

更复杂的是:

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

我认为您假设这是同步执行的,即
setText()
runOnUiThread()
返回之前执行。但是,它是异步的,因此下次循环时,如果<代码>仍然为真,您将在UI线程上排队执行另一个操作以设置文本等等,因此UI线程可能永远不会有机会运行,直到操作系统介入以停止失控的线程。

这里有两个问题。首先,简单一点:

while(true)
这将以最大功率运行线程,直到您注意到,操作系统介入以停止失控的线程。例如,您应该添加一个
addTextChangedListener()
监听器

更复杂的是:

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

我认为您假设这是同步执行的,即
setText()
runOnUiThread()
返回之前执行。但是,它是异步的,因此下一次循环时,如果<代码>仍然为真,并且您将在UI线程上的另一个操作排队以设置文本等等,那么UI线程可能永远不会有机会运行,直到操作系统介入停止失控的线程。

如果您不键入
while(真),您可能会看到生活质量的提高
a如果你不再键入
while(true)
,你可能会看到生活质量的提高