質問: 1; //ボタン名変化 playButton.setText(getResources().getString(R.string.stop)); //リセットボタン無効化 resetButtonPlay.setEnabled(false); } break; case R.id.resetButtonPlay: //「リセット」ボタンを押した場合 break; } } ```
回答: 周期処理を実装するには、Handler、Timer、Thread、AsyncTaskなどいくつか方法があります(AsyncTaskは最新APIレベルで非推奨となったので用いない方が良いでしょう)。 このうち、Handlerを用いる例として、そちらのコードに載せた形でサンプルを書いてみました。 ``` public class MainActivity extends AppCompatActivity implements View.OnClickListener { final Handler handler = new Handler(); int count; //再生状態 1=停止状態、2=再生状態 private int state = 1; boolean start = false; int i = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); (この辺省略) } @Override public void onClick(View v) { //押されたボタンのIDを取得 int id = v.getId(); Button playButton = (Button) findViewById(R.id.playButton); Button resetButtonPlay = (Button) findViewById(R.id.resetButtonPlay); switch (id) { case R.id.playButton: //「再生開始」ボタンを押した場合 if (state == 1) {//停止状態の場合、再生開始 state = 2; //ボタン名変化 playButton.setText(getResources().getString(R.string.play)); //リセットボタン有効化 resetButtonPlay.setEnabled(true); //getSplitPosition(sb); if (!start) { // 停止状態からの開始のときだけ行う処理 count = 500; start = true; handler.post(runnable); // Runnableの処理を開始する } } else {//再生状態の場合、再生停止 state = 1; //ボタン名変化 playButton.setText(getResources().getString(R.string.stop)); //リセットボタン無効化 resetButtonPlay.setEnabled(false); } break; case R.id.resetButtonPlay: //「リセット」ボタンを押した場合 handler.removeCallbacks(runnable); // コールバックを除去する start = false; break; } } Runnable runnable = new Runnable() { @Override public void run() { // 再生状態の場合、カウントダウン if (state == 2) { count--; } if (count == 0) { /* ここに5秒ごとに行う処理を記述 */ count = 500; // カウンターをリセット } handler.postDelayed(this, 10); // 10ミリ秒後に自身を再実行 } }; } ``` 開始ボタンを押すと、handler.post()によって変数runnableに実装した処理が呼び出されます。この処理の末尾では、自身を10ミリ秒ごとに再呼び出しするように、handler.postDelayed()を呼び出しています。こんな感じで周期処理を実現できるでしょう。 停止状態からの開始なのか、一時停止からの再開なのかの判断が必要だったので、変数startを追加しています。 runnableの呼び出しが500回繰り返されたときに「ここに5秒ごとに行う処理を記述」というところが実行すれば、「5秒ごとに表示更新」が実現できるでしょう。一時停止したときは、runnableの周期呼び出しは止めず、countの減算だけを止めます(変数stateで判断)。周期処理を完全に除去したいときは、removeCallbacks()を呼びます。 こんな感じでもう少し肉付けすれば想定の形になるのでは。