Я пытаюсь создать действие в своих приложениях для Android, которое выполняет ранее созданное упражнение с помощью упражнения. Это действие в основном получает тренировку из намерения, создает ArrayList из workoutitems из базы данных, а затем выполняет итерацию по ArrayList.
Проблема связана с методами runInReps и runInTime. runInTime должен получить продолжительность упражнения (работ) и создать таймер обратного отсчета, который отсчитывает продолжительность. По окончании должно появиться сообщение "Готово", а при нажатии кнопки "Следующий ответ" перейти к другому набору (или, если его еще не осталось, следующее упражнение - выполненное в методе выполнения). Это не работает - цикл while становится бесконечным, выход из него невозможен. И таймер даже не запускается.
runInReps должен делать что-то похожее, только без таймера - по окончании набора вы должны нажать кнопку и перейти к следующему набору. Как только не осталось подходов, вам следует перейти к следующему упражнению (которое выполняется в методе выполнения).
Можете ли вы указать мне правильное направление? Спасибо!
package android.tomdoischer.workOutDroid;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
public class runWorkout extends AppCompatActivity {
String workoutName;
int setsRemaining;
DatabaseHelperExercise db;
TextView runNameOfExercise;
TextView timeOrRepsRemaining;
TextView exerciseRemaining;
TextView reps;
Button nextRep;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_run_workout);
workoutName = getIntent().getStringExtra("WORKOUT_NAME");
runNameOfExercise = findViewById(R.id.runNameOfExercise);
timeOrRepsRemaining = findViewById(R.id.timeOrRepsRemaining);
exerciseRemaining = findViewById(R.id.exerciseRemaining);
nextRep = findViewById(R.id.nextRep);
reps = findViewById(R.id.reps);
System.out.println("reached ifs");
if(workoutName != null) {
System.out.println("reached run");
run();
} else {
Toast.makeText(this, "You have not selected a workout!", Toast.LENGTH_LONG).show();
}
}
public void run() {
// a method which reads individual workoutItems from the database and returns an ArrayList
// of workoutItems
ArrayList<WorkoutItem> workoutItems = createRunnableWorkout(workoutName);
System.out.println("array created");
// length of the workout
int length = workoutItems.size();
int count = 0;
// running the whole arraylist item by item
for (WorkoutItem item : workoutItems) {
System.out.println("running item");
if (item.getExercise().isMeasureTime()) {
count++;
exerciseRemaining.setText(String.format("%s / %s", String.valueOf(count), String.valueOf(length)));
runInTime(item);
} else {
count++;
exerciseRemaining.setText(String.format("%s / %s", String.valueOf(count), String.valueOf(length)));
runInReps(item);
}
}
// jumps to the finished workout activity, saves the workout name
Intent newIntent = new Intent(runWorkout.this, runWorkoutDone.class);
newIntent.putExtra("WORKOUT_NAME", workoutName);
startActivity(newIntent);
}
public ArrayList<WorkoutItem> createRunnableWorkout(String workoutName) {
ArrayList<WorkoutItem> workoutItems = new ArrayList<>();
db = new DatabaseHelperExercise(this);
Cursor data = db.getDataWorkoutItems(workoutName);
if (data.getCount() == 0) {
Toast.makeText(this, "This workout is empty!", Toast.LENGTH_LONG).show();
} else {
while (data.moveToNext()) {
WorkoutItem workoutItem = new WorkoutItem();
boolean inTime;
if(data.getInt(5) == 1) {
inTime = true;
} else {
inTime = false;
}
workoutItem.setExercise(new Exercise(data.getString(2),inTime));
workoutItem.setSets(data.getInt(3));
if (workoutItem.getExercise().isMeasureTime()) {
workoutItem.setTime(data.getInt(4));
} else {
workoutItem.setReps(data.getInt(4));
}
workoutItems.add(workoutItem);
}
}
return workoutItems;
}
public void runInTime(WorkoutItem item) { //todo fix me
// next button not pressed yet
System.out.println("running runintime");
setsRemaining = item.getSets();
System.out.println("setsremaining " + setsRemaining);
// set text fields
runNameOfExercise.setText(item.getExercise().getName());
reps.setText(String.valueOf(item.getReps()));
timeOrRepsRemaining.setText(String.valueOf(setsRemaining));
System.out.println("text set");
nextRep.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setsRemaining--;
}
});
System.out.println("onclicklistener set");
while (setsRemaining > 0) {
System.out.println("in the while loop");
CountDownTimer cTimer = new CountDownTimer(item.getTime() * 1000, 1000) {
public void onTick(long millisUntilFinished) {
System.out.println("ontick");
timeOrRepsRemaining.setText(String.format("%s s", Long.toString(millisUntilFinished / 1000)));
System.out.println("ontick finished");
}
public void onFinish() {
System.out.println("finished");
timeOrRepsRemaining.setText("Done!");
}
};
cTimer.start();
cTimer.cancel();
}
}
public void runInReps(WorkoutItem item) { //todo fix me
// next button not pressed yet
System.out.println("running runinreps");
setsRemaining = item.getSets();
// set text fields
runNameOfExercise.setText(item.getExercise().getName());
reps.setText(String.format("%s reps", String.valueOf(item.getReps())));
nextRep.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setsRemaining--;
}
});
while (setsRemaining >0) {
timeOrRepsRemaining.setText(String.format("%s sets", String.valueOf(setsRemaining)));
}
}
}
Так что, если у кого-то есть такая же проблема, проблема действительно заключалась в попытке перебрать ArraýList в цикле for- или while-. Это на самом деле не то, чего я хотел достичь - я хочу перейти в ArrayList по нажатию кнопки.
Смотрите фиксированный код для более подробной информации:
package android.tomdoischer.workOutDroid;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
public class runWorkout extends AppCompatActivity {
String workoutName;
int setsRemaining;
boolean inTime;
int move;
int length;
int count;
DatabaseHelperExercise db;
ArrayList<WorkoutItem> workoutItems;
TextView runNameOfExercise;
TextView timeOrRepsRemaining;
TextView exerciseRemaining;
TextView reps;
Button nextRep;
Button nextEx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_run_workout);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // keeps the screen on
workoutName = getIntent().getStringExtra("WORKOUT_NAME");
runNameOfExercise = findViewById(R.id.runNameOfExercise);
timeOrRepsRemaining = findViewById(R.id.timeOrRepsRemaining);
exerciseRemaining = findViewById(R.id.exerciseRemaining);
nextRep = findViewById(R.id.nextRep);
nextEx = findViewById(R.id.nextEx);
reps = findViewById(R.id.reps);
System.out.println("reached ifs");
if(workoutName != null) {
System.out.println("reached run");
run();
} else {
Toast.makeText(this, "You have not selected a workout!", Toast.LENGTH_LONG).show();
}
}
public void run() {
// a method which reads individual workoutItems from the database and returns an ArrayList
// of workoutItems
workoutItems = createRunnableWorkout(workoutName);
System.out.println("array created");
// length of the workout
length = workoutItems.size();
move = 0;
setUpTextViews(move);
}
public ArrayList<WorkoutItem> createRunnableWorkout(String workoutName) {
ArrayList<WorkoutItem> workoutItems = new ArrayList<>();
db = new DatabaseHelperExercise(this);
Cursor data = db.getDataWorkoutItems(workoutName);
if (data.getCount() == 0) {
Toast.makeText(this, "This workout is empty!", Toast.LENGTH_LONG).show();
} else {
while (data.moveToNext()) {
WorkoutItem workoutItem = new WorkoutItem();
boolean inTime;
if(data.getInt(5) == 1) {
inTime = true;
} else {
inTime = false;
}
workoutItem.setExercise(new Exercise(data.getString(2),inTime));
workoutItem.setSets(data.getInt(3));
if (workoutItem.getExercise().isMeasureTime()) {
workoutItem.setTime(data.getInt(4));
} else {
workoutItem.setReps(data.getInt(4));
}
workoutItems.add(workoutItem);
}
}
return workoutItems;
}
public void onNextEx(View v) {
move++;
if(move<length) {
setUpTextViews(move);
} else {
Intent newIntent = new Intent(runWorkout.this, runWorkoutDone.class);
newIntent.putExtra("WORKOUT_NAME", workoutName);
startActivity(newIntent);
}
}
public void onNextSet(View v) {
if (inTime) {
} else {
if(setsRemaining > 1) {
setsRemaining--;
timeOrRepsRemaining.setText(String.format("%s set(s)", String.valueOf(setsRemaining)));
} else {
timeOrRepsRemaining.setText("Done!");
}
}
}
public void setUpTextViews(int move) {
runNameOfExercise.setText(workoutItems.get(move).getExercise().getName());
setsRemaining = workoutItems.get(move).getSets();
inTime = workoutItems.get(move).getExercise().isMeasureTime();
if(workoutItems.get(move).getExercise().isMeasureTime()) {
reps.setText(String.valueOf(setsRemaining) + " set(s)");
new CountDownTimer(workoutItems.get(move).time * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
timeOrRepsRemaining.setText(millisUntilFinished / 1000 + " s");
}
@Override
public void onFinish() {
timeOrRepsRemaining.setText("Done!");
}
}.start();
} else {
reps.setText(String.valueOf(workoutItems.get(move).getSets()) + " rep(s)");
timeOrRepsRemaining.setText(String.valueOf(workoutItems.get(move).getReps()) + " set(s)");
}
exerciseRemaining.setText((move + 1) + " / " + length);
}
}