Sự khác biệt giữa Activity.runOnUiThreadvà View.post, ai đó, xin vui lòng, giải thích?
Sự khác biệt giữa Activity.runOnUiThreadvà View.post, ai đó, xin vui lòng, giải thích?
Câu trả lời:
Không có sự khác biệt thực sự, ngoại trừ việc View.posthữ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 là hậu trường.
Như CommonsWare đã đề cập trong nhận xét, có sự khác biệt giữa hai - khi được gọi trên luồng Ui, Activity#runOnUiThreadsẽ gọi runphương thức trực tiếp, trong khi View#postsẽ đăng runnablelê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à đối với bất kỳ ai sử dụng nó, không được có sự khác biệt (và việc triển khai có thể thay đổi trong tương lai).
runOnUiThread()kiểm tra luồng hiện tại và thực thi Runnablengay lập tức nếu chúng ta tình cờ ở trên luồng ứng dụng chính. post()luôn đặt Runnablehàng đợi, bất kể nó được gọi theo luồng nào.
runOnUiThread()kiểm tra luồng hiện tại và thực thi Runnablengay lập tức nếu chúng tôi tình cờ ở trên luồng ứng dụng chính " (nhấn mạnh thêm). "Nó có nghĩa là những gì hiện có trên chuỗi giao diện người dùng bị bỏ qua và điều này được ưu tiên hàng đầu?" - "cái gì bao giờ hiện là trên thread UI" là các runOnUiThread()cuộc gọi.
Một sự khác biệt khác giữa Activity.runOnUiThread và view.post () là runnable trong view.post () được gọi sau khi view được gắn vào một cửa sổ.
Hoặc là chấp nhận được đối với hầu hết các tình huống và phần lớn họ là hoán đổi cho nhau, nhưng họ là một cách tinh tế khác nhau. Sự khác biệt lớn nhất tất nhiên là một cái có sẵn từ một Activityvà cái kia từ a View. Có rất nhiều sự chồng chéo giữa những thứ đó, nhưng đôi khi trong một tập Activitybạn sẽ không có quyền truy cập vào một Viewvà đôi khi trong một tập Viewbạn sẽ không có quyền truy cập vào một Activity.
Một trong những trường hợp phức tạp mà tôi đã gặp mà View.posttôi đã đề cập trong câu trả lời cho một câu hỏi SO khácView.post : View.postchỉ hoạt động từ một luồng khác khi luồngView được gắn vào một cửa sổ. Điều này hiếm khi là một vấn đề, nhưng đôi khi có thể khiến Runnablenó không bao giờ thực thi, đặc biệt nếu bạn gọi View.posttrong onCreatephương thức của bạn Activity. Một giải pháp thay thế là sử dụng Handler.postcái nào là cái gì Activity.runOnUiThreadvà View.postdù sao cũng sử dụng dưới các trang bìa.
(đã chỉnh sửa cho chính xác, được thêm vào "từ một chủ đề khác")
onCreate()cũng? Hm, tôi mong rằng nó sẽ được đăng lên người Handlerđược cung cấp ViewRoottrong trường hợp đó.
View.postnên thêm Runnablevào hàng đợi để thực thi sau nếu nó chưa được đính kèm. Tôi chưa tìm hiểu sâu hơn về nguồn, nhưng các tài liệu cho biết: "Phương thức này chỉ có thể được gọi từ bên ngoài chuỗi giao diện người dùng khi Chế độ xem này được đính kèm với một cửa sổ." Vì vậy, tôi nghĩ nếu nó trên chủ đề hiện tại, thì những gì bạn nói là đúng, nếu không phải thì nó có thể nuốt chửng Runnable. Tôi chắc chắn đã có điều đó xảy ra trong mã của mình.