Android上运行runOnUiThread()和无限循环

时间:2017-08-02 23:34:52

标签: java multithreading android-runonuithread

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

1 个答案:

答案 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线程可能永远不会有机会运行直到操作系统介入停止失控线程。