CountDownTimer cancel() 不会取消计时器并继续工作
CountDownTimer cancel() doesn't cancel the timer and continue working
我正在使用 CountDownTimer class 更新 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() 继续调用。
尝试将 CountDownTimer 维护为方法局部变量而不是 global/class 级别变量,因为 如果触发timeDownTimer() 多次然后 countDownTimer[=20= 的旧引用] 将会丢失,您将无法取消之前启动的计时器。
我认为这可能是个问题。
您可以在 onFinish 方法中取消您的 CountDownTimer。试试这个
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();
}
您不需要在 fetchUserPoints() 中调用 countDownTimer.cancel() 因为您调用了 fetchUserPoints() 在 onFinish 方法中 countDownTimer;您正在尝试取消已结束的进程。
我正在使用 CountDownTimer class 更新 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() 继续调用。
尝试将 CountDownTimer 维护为方法局部变量而不是 global/class 级别变量,因为 如果触发timeDownTimer() 多次然后 countDownTimer[=20= 的旧引用] 将会丢失,您将无法取消之前启动的计时器。
我认为这可能是个问题。
您可以在 onFinish 方法中取消您的 CountDownTimer。试试这个
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();
}
您不需要在 fetchUserPoints() 中调用 countDownTimer.cancel() 因为您调用了 fetchUserPoints() 在 onFinish 方法中 countDownTimer;您正在尝试取消已结束的进程。