Не могу остановить таймер, хотя использовал условный - единственное, что не перестает повторяться, не знаю куда поставить timer.cancel или timer.purgue Когда Nrepetir = false, задача больше не повторяется, потому что таймер не останавливается, я попробую очистить, отменить и task.cancel или условно, но всегда повторяю. ЗДЕСЬ ВСЕ МЕТОДЫ:
final Handler handler = new Handler();
final Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
if (Nrepetir==true) {
Nrepetir=false;
AsyncHttpClient clienteTurno = new AsyncHttpClient();
RequestParams rpTurno = new RequestParams();
rpTurno.put("IdPartida", IdPartida);
rpTurno.put("IdUsuario", IdUsuario);
clienteTurno.get(urlTurno, rpTurno, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
if (statusCode == 200) {
String respuesta = response.toString();
Gson gson = new Gson();
ComprobarTurno turno = gson.fromJson(respuesta, ComprobarTurno.class);
int res = turno.getSuccess();
Log.d("DEBUG - MENSAJE TURNO", turno.getMessage());
//Si es correcta
turnoJugador = turno.getPosicion();
turnoActual = turno.getTurno();
valorRecibidoReal = turno.getValorRecibidoReal();
valorRecibido = turno.getValorRecibido();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
}
@Override
public boolean getUseSynchronousMode() {
return false;
}
});
AsyncHttpClient clienteCorreos = new AsyncHttpClient();
RequestParams rpCorreos = new RequestParams();
rpCorreos.put("IdPartida", IdPartida);
clienteCorreos.get(urlCorreos, rpCorreos, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
if (statusCode == 200) {
String respuesta = response.toString();
Gson gson = new Gson();
CorreosPartida correos = gson.fromJson(respuesta, CorreosPartida.class);
int res = correos.getSuccess();
lista.addAll(correos.getCorreos());
Log.d("DEBUG - NOMBRE1", lista.get(0));;
Log.d("DEBUG - NOMBRE2", lista.get(1));;
}
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
}
@Override
public boolean getUseSynchronousMode() {
return false;
}
});
AsyncHttpClient clienteFallos = new AsyncHttpClient();
RequestParams rpFallos = new RequestParams();
rpFallos.put("IdPartida", IdPartida);
clienteFallos.get(urlFallos, rpFallos, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
if (statusCode == 200) {
String respuesta = response.toString();
Gson gson = new Gson();
FallosPartida fallos = gson.fromJson(respuesta, FallosPartida.class);
Log.d("DEBUG - FALLOS", fallos.getMessage());
for (String s : fallos.getFallos()) {
listaFallosVariable.add(Integer.valueOf(s));
Log.d("DEBUG - FALLOS", s);
}
}
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
}
@Override
public boolean getUseSynchronousMode() {
return false;
}
});
}else {
Log.d("DEBUG - TIMER CANCEL", String.valueOf(Nrepetir));
timer.cancel();
}
}
};
Log.d("DEBUG - BOOLEAN", String.valueOf(Nrepetir));
timer.schedule(task, 0, 3000);
проблема будет в том, что задача таймера повторяет все действия, а не только ту часть кода, которая находится внутри нее, поэтому логические переменные, с помощью которых я контролирую эту остановку или выполнение определенных действий, всегда возвращаются к своему начальному значению, а задача таймера никогда заканчивается
Вы создаете новую копию вашего new Runnable
каждый раз, когда ваш TimerTask
срабатывает.
Как я мог этого избежать? Это единственное, что не дает мне закончить заявку
Раньше у меня была такая же проблема. Он запускает новую TimerTask каждый раз, когда вы выполняете свой код, поэтому он будет запускаться столько раз, сколько вы его выполняете. Чтобы предотвратить это, я создал еще один столбец из моей базы данных, который проверяет, находится ли расписание в очереди с задачей таймера. Например:
После запуска timerTask измените статус на 1, затем после его выполнения измените его на 0. Он будет работать, если есть условный оператор, по которому ваша timertask будет запускаться, только если статус равен 0.
Вы также можете сделать это, используя глобальную переменную или массив, в зависимости от того, что вам нужно и что вам удобно.
if (Nrepetir == true) {task = new TimerTask () {@Override public void run () {//handler.post(new Runnable () {// public void run () {try {}}; Nrepetir = noRepetir ; timer.schedule (task, 0, 3000);} Я понимаю решение, которое вы мне даете, но я не знаю, как его применить, это то, что я пробовал, но он не работает, Nrepetir - это локальная переменная, Repetir и не повторяйте глобальные переменные.
Как вы получаете доступ к глобальной переменной? Убедитесь, что вы не создаете экземпляр глобальной переменной при ее вызове, поскольку она только сбросит ее значение.
Сначала я создаю эту локальную переменную private boolean Nrepetir = Repetir (global) Это обработчик timertask = new Handler (); timer = новый Таймер (); if (Nrepetir == Repetir) {task = new TimerTask () {@Override public void run () {CODE
new Handler (). postDelayed (new Runnable () {public void run () {final ProgressDialog progressDialog = new ProgressDialog (PartidaOnlineActivity.this); if (turnoActual.equalsIgnoreCase (turnoJugador)) {Nrepetir = noRepeDEr} (global); ; КОНЕЦ ЗАДАЧИ} КОНЕЦ ЕСЛИ timer.schedule (задача, 0, 3000);
Вы вызываете Nrepitir = repitir (global), когда вызываете свою функцию?
да, я пробовал все, что думаю, теперь я отлаживаю метод к методу
Вы пробовали манипулировать этим массивом? например, вы создаете идентификатор для каждой задачи, которую собираетесь выполнять, и перед запуском таймера проверяйте каждый индекс вашего ГЛОБАЛЬНОГО массива, если ваш идентификатор уже существует в этом массиве. Может, что-то вроде этого может сработать. Это та же концепция, что и я с моей проблемой, но я использовал для этого базу данных.
Я пробовал использовать глобальную переменную, но не работает, и ваш комментарий, если идентификатор существует в массиве, что мне делать? , Можно код как-нибудь более понятно послать?
Непонятно, в чем проблема, не могли бы вы переформулировать вопрос. Насколько я понимаю, после перезапуска активности происходит что-то непредвиденное.