Một custom View đọc tiến độ từ công việc nền. Bạn đã đổi giá trị nhưng hình trên màn hình vẫn cũ cho đến khi View được vẽ lại bởi thao tác khác. Hãy xác định nguồn dữ liệu mà onDraw đọc, rồi yêu cầu hệ thống cập nhật phần hiển thị khi dữ liệu đổi.
Ví dụ và cách đọc
Android View cung cấp postInvalidate để lên lịch invalidate, có thể gọi từ ngoài UI thread. Ví dụ minh họa một snapshot số nguyên duy nhất có volatile. Import android.view.View và đọc percent trong onDraw của custom View đã gắn vào cửa sổ. Đoạn này không gọi trực tiếp onDraw từ worker.
class ProgressSnapshot {
@Volatile
var percent: Int = 0
private set
fun updateFromWorker(value: Int, view: View) {
percent = value.coerceIn(0, 100)
view.postInvalidate()
}
}
Kiểm tra kết quả
Kiểm tra bằng cách gửi một giá trị nhỏ rồi một giá trị lớn, theo dõi dữ liệu mà onDraw đọc. Một số lần cập nhật gần nhau có thể được hiển thị gộp. Nếu giao diện cần từng bước riêng, định nghĩa cách chuyển trạng thái thay vì dùng số lần vẽ làm bộ đếm tác vụ. Kiểm tra thêm trường hợp View đã rời màn hình trước khi gửi cập nhật.
Áp dụng và giới hạn
Nếu dữ liệu gồm nhiều trường liên quan, dùng snapshot bất biến hoặc đưa cập nhật về UI thread để tránh đọc các trường của hai trạng thái khác nhau. Đổi nội dung vẽ bên trong cùng kích thước khác với yêu cầu đo lại khi kích thước mong muốn thay đổi. Đối chiếu View API ngày 13/11/2026. Đoạn Kotlin được rà thủ công và chưa chạy SDK, emulator hoặc đo số frame.
Tình huống áp dụng
Tách bài thử dữ liệu khỏi bài thử vẽ. Trước tiên xác nhận giá trị âm được chặn về 0 và giá trị lớn hơn 100 được chặn về 100. Sau đó gắn custom View vào cửa sổ, cho worker gửi một giá trị và quan sát nhãn hoặc hình vẽ ở trạng thái ổn định. Tránh viết test buộc mỗi lần gửi tương ứng đúng một lần onDraw, vì hệ thống có thể lên lịch và gộp yêu cầu theo chu kỳ.
Với Activity hoặc Fragment thật, kiểm tra nơi bắt đầu và kết thúc việc nhận cập nhật. Nếu worker có thể giữ View qua lần xoay màn hình, đổi cách truyền dữ liệu để màn hình mới đăng ký lại theo vòng đời. Trạng thái tiến độ có thể tồn tại độc lập với View, còn yêu cầu vẽ chỉ có ý nghĩa khi có View hiện tại. Hợp đồng API cho phép gọi ngoài UI thread khi View đã gắn với cửa sổ. Giữ điều kiện đó ở lớp tích hợp và kiểm tra cả lúc rời màn hình.


