CountDownTimer cancel () не отменяет таймер и продолжает работать - PullRequest
0 голосов
/ 18 октября 2019

Я использую класс CountDownTimer для обновления базы данных реального времени firebase, но кажется, что метод cancel () не работает.

Я хочу, чтобы таймер заканчивал вызывать fetchUserPoints () и сам добавлять точки.

Не могли бы вы мне помочь, пожалуйста?

int time = 6;
private CountDownTimer countDownTimer;


private void timeDownTimer() {
        countDownTimer = new CountDownTimer(6000, 1000) {

            public void onTick(long millisUntilFinished) {
                tvTimer.setText("0:" + checkDigit(time));
                time--;

            }

            public void onFinish() {
                tvTimer.setText("Time finished");
                fechUserPoints();
            }


        }.start();
    }

    public String checkDigit(int number) {
        return number <= 9 ? "0" + number : String.valueOf(number);
    }

    private void fetchUserPoints() {
        countDownTimer.cancel();
        reference.child(mId).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                prevPoints = dataSnapshot.child("points").getValue().toString();
                int prePoints = Integer.valueOf(prevPoints);
                String newPoints = String.valueOf(prePoints + ADDED_POINTS);

                reference.child(mId).child("points").setValue(newPoints).addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Toast.makeText(getContext(), "Process is successful", Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

и здесь fetchUserPoints () продолжают вызывать.

Ответы [ 3 ]

1 голос
/ 18 октября 2019

Вы можете просто отменить ваш CountDownTimer внутри метода onFinish. Попробуйте это

int time = 6;
private CountDownTimer countDownTimer;


private void timeDownTimer() {
        countDownTimer = new CountDownTimer(6000, 1000) {

            public void onTick(long millisUntilFinished) {
                tvTimer.setText("0:" + checkDigit(time));
                time--;

            }

            public void onFinish() {
                tvTimer.setText("Time finished");
                countDownTimer.cancel();
                fechUserPoints();
            }


        }.start();
    }

    public String checkDigit(int number) {
        return number <= 9 ? "0" + number : String.valueOf(number);
    }

    private void fetchUserPoints() {

        reference.child(mId).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                prevPoints = dataSnapshot.child("points").getValue().toString();
                int prePoints = Integer.valueOf(prevPoints);
                String newPoints = String.valueOf(prePoints + ADDED_POINTS);

                reference.child(mId).child("points").setValue(newPoints).addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Toast.makeText(getContext(), "Process is successful", Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

Еще один пример: здесь работает

private CountDownTimer countDownTimer;
    int time = 6;

    private void timeDownTimer() {
        countDownTimer = new CountDownTimer(6000, 1000) {

            public void onTick(long millisUntilFinished) {
                Log.e("TIK : " , checkDigit(time));
                time--;

            }

            public void onFinish() {
                countDownTimer.cancel();
                test();
            }


        }.start();
    }

    public String checkDigit(int number) {
        return number <= 9 ? "0" + number : String.valueOf(number);
    }

    private void test(){
        Log.e("TIK : " , "inside my method");
        Toast.makeText(this,"on finish",Toast.LENGTH_LONG).show();
    }
0 голосов
/ 18 октября 2019

Вам не нужно вызывать countDownTimer.cancel () внутри fetchUserPoints () , поскольку вы вызываете fetchUserPoints () внутри onFinish метод countDownTimer ;Вы пытаетесь отменить завершенный процесс.

0 голосов
/ 18 октября 2019

Попробуйте сохранить CountDownTimer как локальную переменную метода, а не как глобальную переменную / переменную уровня класса, , потому что , если вы запускаете timeDownTimer () несколько раз, тогда старая ссылка countDownTimer будет потеряна, и вы не сможете отменить предыдущие таймеры, которые были инициированы.

Я думаю, что это можетможет быть проблема здесь.

...