2012-02-09 20 views
5

Tôi đã tạo một cá thể xử lý trong chuỗi ui chính (mUIHandler) và từ một chuỗi công nhân (thread khác) khi tôi đang cố gắng thực thi phương thức chạy của các runnable phương pháp chạy được thực hiện gần 9 trong số 10 lần nhưng có 1 thời gian khi nó không được thực hiện.handler.post (runnable) không luôn luôn chạy phương thức chạy trong android

mUIHandler.post (uiRunnable) -> không phải lúc nào cũng đảm bảo thực thi phương pháp chạy có trong runnable không?

Tôi thậm chí còn thêm các phương thức ghi nhật ký để kiểm tra và có thể thấy rằng các bản ghi cho đến khi phương thức bài viết được thực hiện nhưng nhật ký phương thức chạy không được hiển thị.

Bài đăng (runnable) hoạt động như thế nào trong nội bộ? nó đảm bảo rằng thread ui (thread với handler) sẽ thực hiện điều này ngay sau khi bài được gọi?

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn!

+4

Mã bưu điện liên quan đến vấn đề. – kosa

+1

@thinksteep sẽ cố gắng xem xét đề xuất được đưa ra bởi mattc dưới đây để xem tôi có thể làm điều gì đó về nó hay không. Tôi tránh đăng đoạn mã ở đây với hơn 500 dòng mã. Cảm ơn! – Deva

Trả lời

6

Tôi chưa bao giờ thấy Trình xử lý không chạy đúng chương trình chạy được đăng. Một số điều cần điều tra:

  1. Có logic nào không.
  2. Bạn có thử/bắt bất cứ nơi nào có thể âm thầm ăn ngoại lệ không?

Bỏ phiếu của tôi (mà không thấy mã của bạn) là nó có thể là # 1. Bạn sẽ không phải là người đầu tiên trở thành nạn nhân của các điều kiện đua xe khó theo dõi do logic đồng thời.

+0

Cảm ơn Mattc cho câu trả lời tôi sẽ vượt qua kiểm tra cho một điều kiện chủng tộc có thể. (Hy vọng tôi có thể xác định vị trí nó.) Sẽ cập nhật. – Deva

+1

Cảm ơn @ Mattc đó là tình trạng cuộc đua đang thực hiện nó. Rất may đã có thể tìm ra nguyên nhân. Thực sự là một học tập tốt. – Deva

+0

Rất vui khi bạn tìm thấy nó. Logic luồng là nổi tiếng khó xử và khó gỡ lỗi. – MattC

10

Tôi cũng đã gặp sự cố này trên Android 2.2, trong trường hợp của tôi cả Runnables và Tin nhắn đều được sử dụng với cùng một Trình xử lý.

Sau khi xem mã nguồn trình xử lý, nó chỉ ra rằng việc xóa thư có giá trị 'what' bằng 0 cũng sẽ xóa tất cả Runnables xếp hàng đợi. Điều này xảy ra bởi vì trong lớp Handler, Runnable được đăng trong nội bộ dưới dạng thông báo có giá trị 'what' bằng 0, tất cả đều bị xóa bởi bất kỳ lệnh gọi nào tới removeMessages(0). Do đó, tránh sử dụng số không làm id tin nhắn.

+0

Nếu chỉ có thể có hai câu trả lời được ưu tiên. Tôi không có ý tưởng bao nhiêu thời gian bạn đã lưu tôi với câu trả lời này, nhưng đó là rất nhiều thời gian! –

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