Android UiThread (chuỗi giao diện người dùng) là gì


81

Ai đó có thể giải thích cho tôi chính xác chuỗi giao diện người dùng là gì không? Trên developer.android.com, nó nói về chức năng runOnUiThread

public Final void runOnUiThread (Runnable action)

Kể từ: API Cấp 1 Chạy hành động được chỉ định trên chuỗi giao diện người dùng. Nếu luồng hiện tại là luồng giao diện người dùng, thì hành động sẽ được thực thi ngay lập tức. Nếu luồng hiện tại không phải là luồng giao diện người dùng, thì hành động sẽ được đăng lên hàng đợi sự kiện của luồng giao diện người dùng.

Chuỗi giao diện người dùng có nghĩa là điều này sẽ được chạy mỗi khi hoạt động được đẩy nền bởi một số hoạt động ui như cuộc gọi đến hoặc làm mờ màn hình, v.v.? Nếu không, chính xác thì chuỗi giao diện người dùng bao gồm những gì?

Cảm ơn bạn

Câu trả lời:


143

UIThread là luồng thực thi chính cho ứng dụng của bạn. Đây là nơi hầu hết mã ứng dụng của bạn được chạy. Tất cả các thành phần ứng dụng của bạn (Hoạt động, Dịch vụ, ContentProviders, BroadcastReceivers) đều được tạo trong luồng này và mọi lệnh gọi hệ thống đến các thành phần đó đều được thực hiện trong luồng này.

Ví dụ: giả sử ứng dụng của bạn là một lớp Hoạt động duy nhất. Sau đó, tất cả các phương thức vòng đời và hầu hết mã xử lý sự kiện của bạn được chạy trong UIThread này. Đây là những phương pháp như onCreate, onPause, onDestroy, onClickvv Ngoài ra, đây là nơi mà tất cả các bản cập nhật cho giao diện người dùng được thực hiện. Bất kỳ điều gì khiến giao diện người dùng được cập nhật hoặc thay đổi ĐỀU xảy ra trên chuỗi giao diện người dùng.

Để biết thêm thông tin về Quy trình và Chuỗi ứng dụng của bạn, hãy nhấp vào đây.

Khi bạn tạo ra một luồng mới một cách rõ ràng để thực hiện công việc ở chế độ nền, thì mã này sẽ không được chạy trên UIThread. Vì vậy, điều gì sẽ xảy ra nếu luồng nền này cần thực hiện điều gì đó thay đổi giao diện người dùng? Đây là những gì runOnUiThreadlà cho. Trên thực tế, bạn phải sử dụng Handler (xem liên kết bên dưới để biết thêm thông tin về điều này). Nó cung cấp cho các luồng nền này khả năng thực thi mã có thể sửa đổi giao diện người dùng. Họ làm điều này bằng cách đặt mã sửa đổi giao diện người dùng trong một đối tượng Runnable và chuyển nó đến phương thức runOnUiThread.

Để biết thêm thông tin về các chuỗi nhân viên sinh sản và cập nhật giao diện người dùng từ họ, hãy nhấp vào đây

Cá nhân tôi chỉ sử dụng runOnUiThreadphương pháp này trong Kiểm tra thiết bị của mình. Vì mã kiểm tra không thực thi trong UIThread, bạn cần sử dụng phương pháp này để chạy mã sửa đổi giao diện người dùng. Vì vậy, tôi sử dụng nó để đưa các sự kiện nhấp chuột và chính vào ứng dụng của mình. Sau đó, tôi có thể kiểm tra trạng thái của ứng dụng để đảm bảo những điều chính xác đã xảy ra.

Để biết thêm thông tin về kiểm tra và chạy mã trên UIThread, hãy nhấp vào đây


3
Lớn giải thích, đặc biệt là liên kết cho nguyên tắc cơ bản ứng dụng một mình phải đọc cho tất cả người mới bắt đầu như tôi :)
Java Sinh

1
Bạn không nên sử dụng AsyncTaskthay vì runOnUiThreadtrong hầu hết các trường hợp?
JDJ

5
@JDJ 2 kỹ thuật có mục đích khác nhau: AsyncTasksẽ giúp bạn TẮT luồng chính, vào nền; runOnUiThread()sẽ giúp bạn ONTO luồng chính, từ nền. Vì vậy, nó phụ thuộc vào những gì bạn đang cố gắng hoàn thành.
Richard Le Mesurier

10

Nếu bạn thực thi mã chặn (ví dụ: Http-Request) trong một Chủ đề riêng, hãy xem xét sử dụng AsyncTask . doInBackground-Method của nó chạy trên một Thread riêng biệt. AsyncTaskcung cấp cho bạn các phương thức onProgressUpdateonPostExecuteđược đảm bảo chạy trên chuỗi giao diện người dùng .

Nếu bạn cần cập nhật tiến trình GUI (ví dụ: thông qua thanh tiến trình), hãy gọi publishProgressvào bên trong doInBackground. Điều này dẫn đến một cuộc gọi tiếp theo onPublishProgresscũng được đảm bảo chạy trên chuỗi giao diện người dùng .

onPostExecuteđược tự động gọi sau khi doInBackgroundtrả về.


4

Tất cả các bản vẽ giao diện người dùng, v.v. diễn ra trong một chuỗi riêng biệt. Nó được gọi là UIThread. Nếu bạn muốn thực hiện bất kỳ thay đổi nào đối với giao diện người dùng, bạn phải sử dụng đảm bảo rằng nó xảy ra trong ngữ cảnh của UIThread. Cách dễ nhất để làm điều đó là tận dụngrunOnUiThread


Bạn có thể chuẩn bị cấu trúc dữ liệu tiện ích con (như thổi phồng một Bố cục) trong một chuỗi không phải UI và sau đó vẽ chúng sau trong một chuỗi UI không?
SMBiggs

chưa bao giờ thử điều đó nhưng về mặt kỹ thuật thì điều đó có thể xảy ra, vì việc thổi phồng chỉ tạo ra cấu trúc dữ liệu. Phần khi bạn đính kèm vào một hoạt động, v.v. là khi bạn cần thực hiện nó trong ngữ cảnh UIThread.
the100rabh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.