2017-08-02 2 views
0

Ich verstehe das Verhalten meines Codes nicht. Zusammenfassend habe ich einen editText (variable Stunden in meinem Code), der mit "00" beginnt. Ich erstelle einen Thread, der verhindert, dass dieser editText 2-stellig ist. Nehmen wir an, dass dieser editText nicht mehr als 2 Ziffern haben darf. Was ich mache ist, dass ich einen Thread erstelle. In diesem Thread, wenn dieser editText nicht 2 Ziffern (also 1 Ziffer) hat, füge ich ihm eine "0" hinzu.runOnUiThread() und Endlosschleife auf Android

Wenn ich jedoch nur eine Ziffer auf den editText setze, wird es verrückt und geht in eine Endlosschleife und andere Sachen, die ich nicht verstehe. Hier ist mein Code:

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(); 

Darüber hinaus, am Ende, Die editText Stunden angezeigt "00". Ich bekomme auch eine Nachricht "suspending alle Threads dauerte: XXX Sekunden", bevor Sie tatsächlich etwas tun!

+0

Sie können Verbesserungen der Lebensqualität sehen, wenn Sie nie wieder while (true) eingeben – drelliot

Antwort

2

Hier gibt es zwei Probleme. Erstens ist die einfache:

while(true) 

Dies wird den Faden bei voller Leistung laufen, bis, wie Sie zu bemerken scheinen, werden die Schritte das Betriebssystem den außer Kontrolle geratenen Thread zu stoppen in. Sie sollten stattdessen beispielsweise einen Listener addTextChangedListener() hinzufügen.

Je komplexer ist:

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

Ich glaube, Sie gehen davon aus, dass diese synchron ausgeführt wird, das ist die setText() vor runOnUiThread() kehrt ausgeführt wird. Es ist jedoch asynchron, so dass das nächste Mal um die Schleife Ihre if immer noch wahr ist, und Sie eine andere Aktion auf dem UIhread, um den Text usw. festlegen, so dass der UI-Thread nie eine Chance erhalten, bis die OS-Schritte ausgeführt werden um den Runaway-Thread anzuhalten.

Verwandte Themen