gpt4 book ai didi

java - Android 上的 runOnUiThread() 和无限循环

转载 作者:行者123 更新时间:2023-12-02 02:40:59 25 4
gpt4 key购买 nike

我不明白我的代码的行为。总而言之,我有一个以“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 秒”!

最佳答案

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

while(true)

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

更复杂的是:

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

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

关于java - Android 上的 runOnUiThread() 和无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45472576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com