Я не могу остановить таймер, он не перестает повторяться

Не могу остановить таймер, хотя использовал условный - единственное, что не перестает повторяться, не знаю куда поставить 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);

Непонятно, в чем проблема, не могли бы вы переформулировать вопрос. Насколько я понимаю, после перезапуска активности происходит что-то непредвиденное.

anber 17.12.2018 10:15

проблема будет в том, что задача таймера повторяет все действия, а не только ту часть кода, которая находится внутри нее, поэтому логические переменные, с помощью которых я контролирую эту остановку или выполнение определенных действий, всегда возвращаются к своему начальному значению, а задача таймера никогда заканчивается

Alejandro Moreno 17.12.2018 10:20

Вы создаете новую копию вашего new Runnable каждый раз, когда ваш TimerTask срабатывает.

chrylis -cautiouslyoptimistic- 17.12.2018 10:33

Как я мог этого избежать? Это единственное, что не дает мне закончить заявку

Alejandro Moreno 17.12.2018 10:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
85
1

Ответы 1

Раньше у меня была такая же проблема. Он запускает новую 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 и не повторяйте глобальные переменные.

Alejandro Moreno 17.12.2018 11:24

Как вы получаете доступ к глобальной переменной? Убедитесь, что вы не создаете экземпляр глобальной переменной при ее вызове, поскольку она только сбросит ее значение.

matt217 17.12.2018 11:32

Сначала я создаю эту локальную переменную private boolean Nrepetir = Repetir (global) Это обработчик timertask = new Handler (); timer = новый Таймер (); if (Nrepetir == Repetir) {task = new TimerTask () {@Override public void run () {CODE

Alejandro Moreno 17.12.2018 11:55

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);

Alejandro Moreno 17.12.2018 11:55

Вы вызываете Nrepitir = repitir (global), когда вызываете свою функцию?

matt217 18.12.2018 01:58

да, я пробовал все, что думаю, теперь я отлаживаю метод к методу

Alejandro Moreno 18.12.2018 03:33

Вы пробовали манипулировать этим массивом? например, вы создаете идентификатор для каждой задачи, которую собираетесь выполнять, и перед запуском таймера проверяйте каждый индекс вашего ГЛОБАЛЬНОГО массива, если ваш идентификатор уже существует в этом массиве. Может, что-то вроде этого может сработать. Это та же концепция, что и я с моей проблемой, но я использовал для этого базу данных.

matt217 18.12.2018 03:53

Я пробовал использовать глобальную переменную, но не работает, и ваш комментарий, если идентификатор существует в массиве, что мне делать? , Можно код как-нибудь более понятно послать?

Alejandro Moreno 18.12.2018 14:42

Другие вопросы по теме