2016-05-08 4 views
1

アクティビティでサンプルカウンタを実行するにはどうすればよいですか?これは動作していません。ループ内のカウンタ

public class MainActivity extends AppCompatActivity implements Runnable { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     run(); 
    } 

    @Override 
    public void run() { 
     while (true) { 
      updateTv(); 

      try { 
       Thread.sleep(17); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void updateTv() { 
     int counter = 100; 
     final TextView tv = (TextView) findViewById(R.id.tv); 
     tv.setText(String.valueOf(counter)); 
     counter--; 
    } 
} 
+0

ここに実際の質問はありません。少なくとも、何がうまくいかないのか、何が問題になっているのかを述べてください。 –

答えて

4

onCreate()では、UIスレッド内で無限ループを開始して完全にブロックしています。定期的に更新する場合は、Handlerを使用することもできます。おそらくより大きな遅延を使用し、いつかそれを停止します。

public class MainActivity extends AppCompatActivity implements Runnable { 
    private final Handler mHandler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     run(); 
    } 

    @Override 
    public void run() { 
     updateTv(); 
     mHandler.postDelayed(this, 17); 
    } 

    public void updateTv() { 
     int counter = 100; 
     final TextView tv = (TextView) findViewById(R.id.tv); 
     tv.setText(String.valueOf(counter)); 
     counter--; 
    } 
} 

とにかくWhat is the Android UiThread (UI thread)とお読みください。

+0

これで動作します。私は確かにそれを読むでしょう。どうもありがとう ;) – djmloody27

1

Timerクラスを使用すると、指定されたレートで呼び出されるコールバックメソッドを定義できます。あなたのニーズに合った

例:注目されるべきで

public class CounterActivity extends AppCompatActivity { 
    private TextView mCounterTextView; 
    private Timer mTimer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_counter); 

     mCounterTextView = (TextView) findViewById(R.id.counterTextView); 

     mTimer = new Timer(); 
     mTimer.scheduleAtFixedRate(
      new CounterTask(100), 0, TimeUnit.SECONDS.toMillis(1)); 
    } 

    protected class CounterTask extends TimerTask { 
     protected int mCounter; 

     CounterTask(int initial) { 
      mCounter = initial; 
     } 

     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        mCounterTextView.setText(String.valueOf(mCounter)); 
       } 
      }); 

      --mCounter; 
     } 
    } 
} 

もう一つ。 Timerは独自のスレッドを実行するため、メインスレッドの外部からUIを更新できなくなります。その場合 runOnUiThreadメソッドを使用してRunnableを登録する必要があります。

また、ループでfindViewByIdを呼び出すことは最適ではありません。

関連する問題