2017-08-02 47 views
0

私のコードの動作が分かりません。要約すると、私は "00"で始まるeditText(私のコードでは時間が変わる)を持っています。私はこのeditTextが2桁を持たないようにするスレッドを作成しています。このeditTextは2桁を超えることはできません。私がしていることは、スレッドを作成することです。このスレッドでは、このeditTextに2桁(1桁)がないときはいつでも、それに "0"を追加します。runOnUiThread()とAndroidの無限ループ

しかし、私はeditTextに1桁の数字を入力するだけで、狂ってしまい、無限ループや他のものが分かりません。私のコードは次のとおりです。

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

ここには2つの問題があります。まず、簡単な1:

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スレッドはOSのステップまで実行されることはありません暴走しているスレッドを止める。