2010-09-06 26 views
69

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ì? Trên developer.android.com nó nói về chức năng runOnUiThreadAndroid UiThread (UI thread)

công thức khoảng trống runOnUiThread (hành động Runnable)

Từ: API Level 1 Chạy các hành động cụ thể trên thread UI. Nếu chủ đề hiện tại là là chuỗi giao diện người dùng, thì hành động được thực hiện ngay lập tức . Nếu chuỗi hiện tại không phải là chuỗi giao diện người dùng, thì hành động là được đăng vào hàng đợi sự kiện của chuỗi giao diện người dùng.

Chủ đề giao diện người dùng có nghĩa là thao tác này sẽ được chạy mỗi lần hoạt động được đẩy bởi nền 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, chuỗi giao diện người dùng chính xác bao gồm những gì?

Cảm ơn bạn

Trả lời

129

UIThread là luồng chính để thực thi 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 (Các hoạt động, Dịch vụ, Trình cung cấp nội dung, BroadcastReceivers) đều được tạo trong luồng này và mọi cuộc gọi hệ thống đến các thành phần đó đượ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. 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à các phương pháp như onCreate, , onDestroy, onClick, v.v. Ngoài ra, đây là nơi 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ì làm cho giao diện người dùng được cập nhật hoặc thay đổi HAS xảy ra trên chuỗi giao diện người dùng.

For more info on your application's Processes and Threads click here.

Khi bạn sinh ra một cách rõ ràng một chủ đề mới để làm việc ở chế độ nền, mã này không chạy trên UIThread. Vì vậy, điều gì sẽ xảy ra nếu chủ đề nền này cần phải làm điều gì đó thay đổi giao diện người dùng? Đây là nội dung của runOnUiThread. Trên thực tế, bạn phải sử dụng một Trình xử lý (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 các chủ đề 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ã UI-sửa đổi trong một đối tượng Runnable và chuyển nó sang phương thức runOnUiThread.

For more info on spawning worker threads and updating the UI from them click here

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

For more info on testing and running code on the UIThread click here

+3

Giải thích tuyệt vời, liên kết đặc biệt cho các nguyên tắc cơ bản của ứng dụng phải đọc cho tất cả người mới bắt đầu như tôi :) –

+1

Bạn không nên sử dụng 'AsyncTask' thay vì' runOnUiThread' trong hầu hết các trường hợp? – JDJ

+3

@JDJ 2 kỹ thuật có các mục đích khác nhau: 'AsyncTask' sẽ giúp bạn TẮT chủ đề chính, vào nền; 'runOnUiThread()' sẽ đưa bạn ONTO chủ đề chính, từ nền. Vì vậy, nó phụ thuộc vào những gì bạn đang cố gắng để thực hiện. –

3

Tất cả bản vẽ giao diện người dùng vv xảy 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 u phải sử dụng, hãy đảm bảo rằng nó xảy ra trong ngữ cảnh của UIThread. Cách dễ nhất để thực hiện việc này là sử dụng runOnUiThread

+0

Bạn có thể chuẩn bị các cấu trúc dữ liệu widget (như thổi phồng một Bố cục) trong một chuỗi giao diện người dùng không và sau đó vẽ chúng sau này trong một chuỗi giao diện người dùng? –

+0

chưa bao giờ thử điều đó nhưng về mặt kỹ thuật, điều đó có thể xảy ra, vì thổi phồng chỉ tạo ra cấu trúc dữ liệu. Phần của nó khi u đính kèm là một hoạt động vv là khi bạn cần làm điều đó trong một ngữ cảnh UIThread. – the100rabh

8

Nếu bạn thực hiện chặn mã (ví dụ một Http-Request) trong một chủ đề riêng biệt, xem xét sử dụng AsyncTask. doInBackground -Media của nó chạy trên một Thread riêng biệt.AsyncTask cung cấp cho bạn các phương pháp 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 publishProgress bên trong doInBackground. Điều này dẫn đến một cuộc gọi tiếp theo là onPublishProgress.

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

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