scheduleAtFixedRate は、呼び出した瞬間から、指定した処理の一定周期での実行をスケジューリングします。
ですので scheduleAtFixedRate の呼び出しを何度 for で繰り返したところで、処理の回数を数えられるわけではありません。
一定回数で止めたりするのであれば、指定した処理内で呼び出し(呼び出され)回数をカウントし、スケジューリングを止める等をする必要があります。
以下は、Timer.scheduleAtFixedRate では無く Handler.postDelay によって処理するようにしたものです。
FlushTexts クラスが Handler.postDelay によって void run() を実行する度に count を +1 し、その値に応じて各テキストの表示および次の実行の設定を行っています。
MainActivity.java
java
1package com.teratail.q364882;
2
3import androidx.appcompat.app.AppCompatActivity;
4
5import android.os.*;
6import android.util.Log;
7import android.widget.*;
8
9public class MainActivity extends AppCompatActivity {
10
11 private class FlushTexts implements Runnable {
12 private final Handler handler;
13 private final TextView text1, text2;
14 private boolean isRun = false;
15 private int count = 0;
16
17 FlushTexts(Handler handler, TextView text1, TextView text2) {
18 this.handler = handler;
19 this.text1 = text1;
20 this.text2 = text2;
21 }
22 void start() {
23 if(isRun) throw new IllegalStateException("既に実行中です");
24 count = 0;
25 isRun = true;
26 postNext(0);
27 }
28 void stop() {
29 if(!isRun) return;
30 synchronized(this) {
31 isRun = false;
32 handler.removeCallbacks(this);
33 }
34 }
35 @Override
36 public void run() {
37 if(++count > 10) { //11
38 count = 0; //次は Go に行く
39 setClearState();
40 } else if(count % 2 == 0) { //2,4,6,8,10
41 setStopState();
42 } else { //1,3,5,7,9
43 setGoState();
44 }
45 }
46 private void setGoState() {
47 Log.d("FlushTexts","GO");
48 setState("GO", "", 1500); //[ms]
49 }
50 private void setStopState() {
51 Log.d("FlushTexts","STOP");
52 setState("", "STOP", 4500); //[ms]
53 }
54 private void setClearState() {
55 Log.d("FlushTexts","CLEAR");
56 setState("", "", 10000); //[ms]
57 }
58 private void setState(String str1, String str2, long delayMillis) {
59 text1.setText(str1);
60 text2.setText(str2);
61 postNext(delayMillis);
62 }
63 synchronized private void postNext(long delayMillis) {
64 if(isRun) handler.postDelayed(this, delayMillis);
65 }
66 }
67
68 @Override
69 protected void onCreate(Bundle savedInstanceState) {
70 super.onCreate(savedInstanceState);
71 setContentView(R.layout.activity_main);
72
73 TextView upview = findViewById(R.id.upview);
74 TextView downview = findViewById(R.id.downview);
75 Button start = findViewById(R.id.start);
76 Button reset = findViewById(R.id.reset);
77 start.setEnabled(true);
78 reset.setEnabled(false);
79
80 FlushTexts flushTexts = new FlushTexts(new Handler(getMainLooper()), upview, downview);
81
82 start.setOnClickListener(view -> {
83 flushTexts.start();
84 start.setEnabled(false);
85 reset.setEnabled(true);
86 });
87
88 reset.setOnClickListener(view -> {
89 flushTexts.stop();
90 upview.setText("");
91 downview.setText("");
92 start.setEnabled(true);
93 reset.setEnabled(false);
94 });
95 }
96}
レイアウト: activity_main.xml
xml
1<?xml version="1.0" encoding="utf-8"?>
2<androidx.constraintlayout.widget.ConstraintLayout
3 xmlns:android="http://schemas.android.com/apk/res/android"
4 xmlns:app="http://schemas.android.com/apk/res-auto"
5 xmlns:tools="http://schemas.android.com/tools"
6 android:layout_width="match_parent"
7 android:layout_height="match_parent"
8 tools:context=".MainActivity">
9
10 <TextView
11 android:id="@+id/upview"
12 android:layout_width="wrap_content"
13 android:layout_height="wrap_content"
14 android:text="Hello World!"
15 app:layout_constraintBottom_toTopOf="@id/downview"
16 app:layout_constraintLeft_toLeftOf="parent"
17 app:layout_constraintRight_toRightOf="parent"
18 app:layout_constraintTop_toTopOf="parent" />
19 <TextView
20 android:id="@+id/downview"
21 android:layout_width="wrap_content"
22 android:layout_height="wrap_content"
23 android:text="Hello World!"
24 app:layout_constraintBottom_toTopOf="@id/start"
25 app:layout_constraintLeft_toLeftOf="parent"
26 app:layout_constraintRight_toRightOf="parent"
27 app:layout_constraintTop_toBottomOf="@id/upview" />
28 <Button
29 android:id="@+id/start"
30 android:layout_width="wrap_content"
31 android:layout_height="wrap_content"
32 android:text="START"
33 app:layout_constraintBottom_toTopOf="@id/reset"
34 app:layout_constraintLeft_toLeftOf="parent"
35 app:layout_constraintRight_toRightOf="parent"
36 app:layout_constraintTop_toBottomOf="@id/downview" />
37 <Button
38 android:id="@+id/reset"
39 android:layout_width="wrap_content"
40 android:layout_height="wrap_content"
41 android:text="RESET"
42 app:layout_constraintBottom_toBottomOf="parent"
43 app:layout_constraintLeft_toLeftOf="parent"
44 app:layout_constraintRight_toRightOf="parent"
45 app:layout_constraintTop_toBottomOf="@id/start" />
46
47</androidx.constraintlayout.widget.ConstraintLayout>
scheduleAtFixedRate を使うとこんな感じでしょうか。
java
1package com.teratail.q364882;
2
3import androidx.appcompat.app.AppCompatActivity;
4
5import android.os.*;
6import android.util.Log;
7import android.widget.*;
8
9import java.util.*;
10
11public class MainActivity extends AppCompatActivity {
12
13 private class FlushTexts extends TimerTask {
14 private final Handler handler;
15 private final TextView text1, text2;
16 private int count = 0;
17
18 FlushTexts(Handler handler, TextView text1, TextView text2) {
19 this.handler = handler;
20 this.text1 = text1;
21 this.text2 = text2;
22 }
23
24 @Override
25 public void run() {
26 if(++count >= 12*5+20) {
27 count = 0; //次は Go に行く
28 } else if(count == 12*5+1) {
29 setClearState();
30 } else if(count <= 12*5) {
31 if(count % 12 == 4) {
32 setStopState();
33 } else if(count % 12 == 1) {
34 setGoState();
35 }
36 }
37 }
38
39 private void setGoState() {
40 Log.d("FlushTexts","GO");
41 setState("GO", "");
42 }
43 private void setStopState() {
44 Log.d("FlushTexts","STOP");
45 setState("", "STOP");
46 }
47 private void setClearState() {
48 Log.d("FlushTexts","CLEAR");
49 setState("", "");
50 }
51 private void setState(String str1, String str2) {
52 handler.post(() -> {
53 text1.setText(str1);
54 text2.setText(str2);
55 });
56 }
57 }
58
59 private Timer timer;
60
61 @Override
62 protected void onCreate(Bundle savedInstanceState) {
63 super.onCreate(savedInstanceState);
64 setContentView(R.layout.activity_main);
65
66 TextView upview = findViewById(R.id.upview);
67 TextView downview = findViewById(R.id.downview);
68 Button start = findViewById(R.id.start);
69 Button reset = findViewById(R.id.reset);
70 start.setEnabled(true);
71 reset.setEnabled(false);
72
73 start.setOnClickListener(view -> {
74 timer = new Timer();
75 FlushTexts flushTexts = new FlushTexts(new Handler(getMainLooper()), upview, downview);
76 timer.scheduleAtFixedRate(flushTexts, 0, 500);
77 start.setEnabled(false);
78 reset.setEnabled(true);
79 });
80
81 reset.setOnClickListener(view -> {
82 timer.cancel();
83 timer = null;
84 upview.setText("");
85 downview.setText("");
86 start.setEnabled(true);
87 reset.setEnabled(false);
88 });
89 }
90}