Những lợi thế của các ứng dụng Android là đơn luồng?


7

Tôi đã đọc một tuyên bố trên http://developer.android.com cho biết:

Khi một ứng dụng được khởi chạy, hệ thống sẽ tạo ra một luồng thực thi cho ứng dụng, được gọi là "chính". Chủ đề này rất quan trọng vì nó chịu trách nhiệm gửi các sự kiện đến các widget giao diện người dùng thích hợp, bao gồm cả các sự kiện vẽ. Nó cũng là luồng trong đó ứng dụng của bạn tương tác với các thành phần từ bộ công cụ UI của Android. Hệ thống không tạo ra một luồng riêng cho từng phiên bản của một thành phần. Tất cả các thành phần chạy trong cùng một quy trình được khởi tạo trong luồng UI và các lệnh gọi hệ thống đến từng thành phần được gửi từ luồng đó.

Tôi chỉ muốn biết lý do tại sao Android đã chọn kiến ​​trúc mô hình luồng đơn này và không dành cho đa luồng. Những lợi thế mà họ đang nhận được từ điều này là gì?


2
Như câu hỏi của bạn cho thấy một triết lý "càng nhiều chủ đề càng tốt": lưu ý rằng việc có nhiều luồng hơn lõi mang lại một hình phạt hiệu suất ngày càng tăng. Vì vậy, nếu bạn có một điện thoại / máy tính bảng lõi kép (hoặc PC), bạn chỉ thực sự muốn có 2 luồng thực sự đang làm việc quan trọng (và có lẽ là một phần ba đang xử lý tương tác người dùng). Các ứng dụng mà mọi thứ đều có chủ đề riêng của nó thường rất chậm
Richard Tingle

Câu trả lời:


20

Các ứng dụng Android không đơn luồng. Mặc dù có một chủ đề chính như được mô tả trong tài liệu bạn trích dẫn, các ứng dụng có thể bắt đầu nhiều chủ đề khác mà chúng cần.

Ưu điểm của tất cả các tương tác GUI nằm trên một luồng là mã GUI có thể đơn giản hơn, nhanh hơn và dễ dự đoán hơn, vì trạng thái GUI không được thay đổi đồng thời từ các luồng khác nhau. Nó cũng làm cho an toàn luồng dễ dàng hơn cho các nhà phát triển ứng dụng bằng cách cung cấp hàng đợi tin nhắn, tương tự như các chuỗi được tìm thấy trong các khung GUI của các HĐH khác. Tác giả ứng dụng chỉ cần đảm bảo tất cả các thao tác dài được thực hiện trong các luồng nền, gửi tin nhắn trở lại luồng chính để cập nhật GUI và theo cách đó GUI luôn đáp ứng mọi lúc.


"Ứng dụng lớn" đầu tiên của tôi khi học rơi vào cái bẫy này. Một cơ sở dữ liệu lớn tra cứu trên cùng một luồng với giao diện người dùng, vì vậy bạn không thể can thiệp vào tất cả hoặc sử dụng nút 'hủy' khi luồng GUI được buộc. Nó dạy bạn nhanh chóng để sử dụng các chủ đề / nhiệm vụ không đồng bộ. "chính" thường là điểm thực thi trong lập trình và luồng đầu tiên hoặc "chính" của một ứng dụng như int main()trong C hoặc public static void main(String[] args)trong Java, v.v. Nó chạy như một phần chính của lời khen ngợi của bạn, vì một cái gì đó phải là điểm khởi đầu.
RossC

+1. NetworkOnMainThreadExceptionchỉ cần chứng minh rằng một ứng dụng Android hỗ trợ (và đôi khi, cần) nhiều luồng để hoạt động chức năng.
Andrew T.

1

Các tài liệu Android chỉ nói rằng luồng chính sẽ tính toán tất cả các chức năng liên quan đến giao diện người dùng. Công việc của nhà phát triển là tạo các luồng bổ sung khi nhận dữ liệu từ cơ sở dữ liệu SQLite cục bộ hoặc từ mạng hoặc ngay cả khi bạn đang tạo Chế độ xem tùy chỉnh nặng tính toán với rất nhiều logic hiển thị.

Để có cái nhìn thực sự toàn diện về Đồng thời trong Android và phân luồng, hãy xem

Android không đồng bộ từ Steve Liles

Cuốn sách tuyệt vời tuyệt vời.

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.