Java Android上的runOnUiThread()和无限循环
我不理解我的代码的行为。总而言之,我有一个以“00”开头的editText(代码中的小时数可变)。我正在创建一个线程,以防止此editText没有2位数字。假设此editText的位数不能超过2位。我所做的是创建一个线程。在这个线程中,每当这个editText没有2个数字(所以是1个数字)时,我就向它添加一个“0” 然而,每当我在编辑文本上加上一个数字,它就会变得疯狂,进入无限循环和其他我不理解的东西。这是我的密码:Java Android上的runOnUiThread()和无限循环,java,multithreading,android-runonuithread,Java,Multithreading,Android Runonuithread,我不理解我的代码的行为。总而言之,我有一个以“00”开头的editText(代码中的小时数可变)。我正在创建一个线程,以防止此editText没有2位数字。假设此editText的位数不能超过2位。我所做的是创建一个线程。在这个线程中,每当这个editText没有2个数字(所以是1个数字)时,我就向它添加一个“0” 然而,每当我在编辑文本上加上一个数字,它就会变得疯狂,进入无限循环和其他我不理解的东西。这是我的密码: Thread digitLessThanTwoThread; 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”。
在实际执行任何操作之前,我还收到一条消息“暂停所有线程花费了: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)
,你可能会看到生活质量的提高