2011-07-24 25 views
15

thể trùng lặp:
How come millisUntilFinished cannot detect exact CountDownTimer intervals?Android CountDownTimer cho thấy 1 trong hai giây

Tại sao sử dụng CountDownTimer chương trình "1" hai lần? Tôi chỉ muốn nó đếm ngược một cách trôi chảy và không giống như nó đang bị treo lên trong giây cuối cùng. Bất cứ ai có bất kỳ ý tưởng về cách giải quyết vấn đề này?

Đây là mã từ trang nhà phát triển Android:

new CountdownTimer(30000, 1000) { 

    public void onTick(long millisUntilFinished) { 
     mTextField.setText("seconds remaining: " + millisUntilFinished/1000); 
    } 

    public void onFinish() { 
     mTextField.setText("done!"); 
    } 
    }.start(); 

Tôi tạo ra một dự án mới và sao chép và dán đoạn mã này chỉ để đảm bảo rằng tôi đã không vô tình rối tung cái gì đó lên trong chương trình của tôi. Tôi đã thử nghiệm điều này trên một Tab 10.1. Nó thực hiện điều này khi tôi chạy nó: "5", "4", "3", "2", "1", "1", "xong!".

+0

Hiển thị cho chúng tôi một số mã. –

+0

Bạn nên đăng xuất giá trị 'millisUntilFinished' trong phương thức' onTick (long) '. Đây là những gì đang được sử dụng để cập nhật 'TextView' của bạn. –

+1

kiểm tra điều này - https://stackoverflow.com/a/47695735/6244429 –

Trả lời

47

CountDownTimer không chính xác, nó sẽ trở lại gần 1 giây (trong trường hợp này) vì nó có thể nhưng thường sẽ không đủ để cung cấp cho bạn những gì bạn muốn.

Nếu bạn đăng nhập MS var, bạn sẽ thấy kết quả là 29384 cho lần truy cập đầu tiên, v.v., sẽ không bao giờ là 30000, 29000 v.v. Không có cách nào để có được độ chính xác mà bạn cần công việc truy cập như bạn dự định hiện đang được triển khai.

Bạn có thể sửa lỗi này cho hầu hết các trường hợp. Đầu tiên bạn giảm khoảng thời gian để bạn nhận được nhiều cập nhật hơn so với những gì bạn muốn xuất, vì vậy thay vì 1 giây làm 100ms và điều đó sẽ giúp bạn có được ảo tưởng về đồng hồ đếm ngược 1 giây kể từ khi bạn nhận được ít nhất một vài cập nhật mỗi giây case)

Để tối ưu hóa bit đó làm tròn kết quả trên mỗi mục nhập và thực hiện kiểm tra đơn giản để xem bạn có nên cập nhật (giâyLeft đã thay đổi) và nếu nó đã cập nhật giao diện người dùng và bộ đếm giây giây. Ngoài ra tôi đề nghị rằng onFinish sản xuất kết quả cuối cùng (0) chỉ trong trường hợp hệ thống ổn định vì một cái gì đó đang xảy ra mà ăn chu kỳ CPU.

Dù sao ở đây là mã đã sửa đổi hoạt động cho 99,99 lần này trong số 100 nếu hệ thống của bạn không được tải nhiều. LƯU Ý: Bạn có thể có thể lấy đi với 250ms, tùy thuộc vào bạn.

int secondsLeft = 0; 

new CountDownTimer(30000, 100) { 
    public void onTick(long ms) { 
     if (Math.round((float)ms/1000.0f) != secondsLeft) 
     { 
      secondsLeft = Math.round((float)ms/1000.0f); 
      TV.setText("seconds remaining: " +secondsLeft); 
     } 
     Log.i("test","ms="+ms+" till finished="+secondsLeft); 
    } 

    public void onFinish() { 
     TV.setText("0"); 
    } 
}.start(); 
+2

Câu trả lời hay, nhưng tôi nghĩ rằng API nên đưa ra gợi ý về lớp không chính xác. –

+0

Gần ba năm sau, và CountdownTimer vẫn hiển thị dấu tick cuối cùng hai lần! Nhưng giải pháp này làm việc cho tôi, cảm ơn! +1 – yiwei

+0

Sau khi thử nhiều giải pháp cuối cùng, giải pháp này đã làm việc cho tôi. cảm ơn +1 – silwar

Các vấn đề liên quan