代码之家  ›  专栏  ›  技术社区  ›  Bazouk55555

Android上的runOnUiThread()和无限循环

  •  0
  • Bazouk55555  · 技术社区  · 7 年前

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ken Y-N    7 年前

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

    while(true)
    

    这将以最大功率运行线程,直到您注意到,操作系统开始阻止失控的线程。您应该添加一个 addTextChangedListener()

    更复杂的是:

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

    setText() 在之前执行 runOnUiThread() 返回。但是,它是异步的,所以下次循环时 if