2017-08-02 112 views
0

我不明白我的代碼的行爲。總而言之,我有一個以「00」開頭的editText(在我的代碼中可變的小時數)。我正在創建一個線程,以防止此editText不具有2位數字。讓我們假設這個editText不能超過2位數。我正在做的是我創建一個線程。在這個線程中,只要這個editText沒有2個數字(所以是1個數字),我就添加一個「0」。runOnUiThread()和Android上的無限循環

但是,無論何時只要在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

如果您從未再次輸入'while(true)',您可能會看到生活質量得到改善 – drelliot

回答

2

這裏有兩個問題。首先,簡單的一個:

while(true) 

這將在滿功率運行的線程,直到你似乎可以注意到,在OS中的步驟停止失控線程。例如,您應該添加一個addTextChangedListener()偵聽器。

更復雜的是:

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

我想你是假設,這是同步執行,即setText()之前runOnUiThread()回報執行。但是,它是異步的,因此下一次循環時,您的if仍然爲true,並且您在UI線程上設置了另一個操作以設置文本等等,因此UI線程可能永遠不會有機會運行,直到操作系統步驟停止失控線程。