我不明白我的代码的行为。总而言之,我有一个以“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”。 在执行任何操作之前,我还收到一条消息“暂停所有线程:XXX秒”!
答案 0 :(得分:2)
这里有两个问题。首先,简单的一个:
while(true)
这将以全功率运行线程,直到你似乎注意到,操作系统介入以停止失控线程。例如,您应该添加addTextChangedListener()
侦听器。
更复杂的是:
main_activity.runOnUiThread(new Runnable() {
@Override
public void run() {
hours.setText("0" + hours.getText().toString());
}
});
我认为你假设这是同步执行的,即在setText()
返回之前执行runOnUiThread()
。但是,它是异步的,所以下次循环时你的if
仍然是真的,你在UI线程上排队另一个动作来设置文本等等,所以UI线程可能永远不会有机会运行直到操作系统介入停止失控线程。