2012-05-11 40 views
81

Sự khác nhau giữa Activity.runOnUiThreadView.post, ai đó có thể, vui lòng giải thích?Android: Sự khác nhau giữa Activity.runOnUiThread và View.post là gì?

+0

câu hỏi tương tự với câu trả lời hữu ích: [Runnable được đăng thành công nhưng không chạy] (http://stackoverflow.com/questions/4083787/runnable-is-posted-successfully-but-not-run), [Whats sự khác biệt giữa Activity.runOnUiThread (hành động runnable) và Handler.post()?] (http://stackoverflow.com/questions/1839625/whats-the-difference-between-activity-runonuithreadrunnable-action-and-handler), [Sự khác biệt giữa Handler.post (Runnable r) và Activity.runOnUiThread (Runnable r)] (http://stackoverflow.com/questions/7452884/difference-between-handler-postrunnable-r-and-activity-runonuithreadrunnable) –

Trả lời

90

Không có sự khác biệt thực sự, ngoại trừ việc View.post hữu ích khi bạn không có quyền truy cập trực tiếp vào hoạt động.

Trong cả hai trường hợp, nếu không có trên chuỗi giao diện người dùng, Handler#post(Runnable) sẽ được gọi phía sau hậu trường.

Như CommonsWare đề cập trong các bình luận, có sự khác biệt giữa hai - khi kêu gọi Ui chủ đề, Activity#runOnUiThread sẽ gọi phương thức run trực tiếp, trong khi View#post sẽ đăng runnable trên hàng đợi (ví dụ gọi Handler#post)

Điểm quan trọng IMO là cả hai đều có cùng mục tiêu và cho bất kỳ ai sử dụng nó, sẽ không có sự khác biệt (và việc triển khai có thể thay đổi trong tương lai).

+59

Một sự khác biệt: 'runOnUiThread()' kiểm tra luồng hiện tại và thực thi 'Runnable' ngay lập tức nếu chúng ta xảy ra trên luồng ứng dụng chính. 'post()' luôn đặt 'Runnable' trên hàng đợi, cho dù nó được gọi là gì. – CommonsWare

+0

@CommonsWare - True, tôi sẽ chỉnh sửa câu hỏi của mình. – MByD

+0

Cảm ơn bạn giờ đây tôi có thể thấy sự khác biệt dựa trên lời giải thích của bạn và nhận xét @CommonsWare. –

14

Hoặc là chấp nhận được đối với hầu hết các trường hợp và phần lớn chúng có thể hoán đổi cho nhau, nhưng chúng khác nhau một cách tinh tế. Sự khác biệt lớn nhất của khóa học là một trong những có sẵn từ một Activity và khác từ một View. Có rất nhiều sự trùng lặp giữa những điều đó, nhưng đôi khi trong một số Activity bạn sẽ không có quyền truy cập vào số View và đôi khi trong một số View bạn sẽ không có quyền truy cập vào số Activity.

Một trong những trường hợp cạnh tôi đã gặp phải với View.post tôi đã đề cập trong an answer to another SO question on View.post: View.post chỉ hoạt động từ một thread khi View được gắn vào một cửa sổ. Đây hiếm khi là một vấn đề, nhưng đôi khi có thể khiến cho Runnable không bao giờ thực thi, đặc biệt nếu bạn gọi View.post theo phương thức onCreate của Activity. Một cách khác là sử dụng Handler.post đó là những gì Activity.runOnUiThreadView.post sử dụng dưới dạng bìa.

(sửa cho chính xác, thêm vào "từ một thread")

+1

Nó có thể thất bại khi unattached trong 'onCreate()' cũng? Hm, tôi hy vọng nó sẽ được đăng lên 'Handler' được cung cấp bởi' ViewRoot' trong trường hợp đó. – Jens

+5

@ Jens Yeah, tôi đã liếc nhìn nguồn và 'View.post' nên thêm' Runnable' vào hàng đợi để được thực hiện sau nếu nó chưa được đính kèm. Tôi chưa đào sâu hơn nguồn, nhưng [docs] (http://developer.android.com/reference/android/view/View.html#post%28java.lang.Runnable%29) nói: "Phương thức này có thể được gọi từ bên ngoài của chuỗi giao diện người dùng chỉ khi Chế độ xem này được gắn vào một cửa sổ." Vì vậy, tôi nghĩ rằng nếu đó là trên các chủ đề hiện tại, sau đó những gì bạn nói là đúng, nếu nó không phải là sau đó nó có thể chỉ nuốt 'Runnable'. Tôi chắc chắn đã có điều đó xảy ra trong mã của tôi. – kabuko

+0

@kabuko Cảm ơn câu trả lời của bạn cho thấy nó từ một điểm khác. Làm thế nào nó là tôi không thể chấp nhận nhiều hơn 1 câu trả lời không thể nhìn thấy logic đằng sau đó sẽ adress meta diễn đàn –

16

Một điểm khác biệt giữa Activity.runOnUiThread và view.post() là Runnable trong view.post() được gọi sau khi xem là gắn liền với một cửa sổ.

+0

Bạn có ý nghĩa như thế nào? Trở nên rõ ràng? Không được gọi trên một cái nhìn vô hình ở tất cả? –

+0

Sửa lỗi mơ hồ Alex. – pareshgoel

+5

Đây là sự khác biệt quan trọng nhất IMHO. Rất nhiều người sử dụng view.post() để thực thi các công cụ cần được thực hiện SAU KHI khung nhìn được đính kèm. – Sotti

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