2012-06-18 34 views
14

Tôi đã phát triển một Ứng dụng và tôi đã thực hiện một số thử nghiệm. Các thử nghiệm này bao gồm trong gửi dữ liệu từ một dịch vụ nền tới một dịch vụ khác . Tất cả dữ liệu được nhận khi tốc độ truyền thấp (4 ý/giây). Tuy nhiên khi tôi tăng tốc độ truyền (8 và 12 ý định/giây), một số dữ liệu (thường là 2 - 3%) là không nhận được bởi dịch vụ đích.Cách Intent hoạt động nội bộ?

Tất cả các ý định đã được phát và các dịch vụ đang chạy cục bộ.

Bất cứ ai có thể cho tôi biết, cách hệ điều hành xử lý Intents và toàn bộ cơ chế hoạt động, để tìm số lý do tại sao dữ liệu không được nhận bởi người nhận?

Trân trọng,

+0

bạn có thể đăng một số mã mẫu mà bạn đã sử dụng để kiểm tra điều này không? – FoamyGuy

+1

tôi chỉ thực hiện sendBroadcast() bên trong một vòng lặp, kiểm soát tỷ lệ với Thread.sleep(). Tôi chỉ muốn xem Intents bahave với tốc độ truyền cao như thế nào. Tôi chỉ sử dụng Intents trước để bắt đầu các dịch vụ, hoạt động và ... –

+3

Nếu không cung cấp một bộ hoàn chỉnh các dự án mẫu thể hiện vấn đề của bạn, chúng tôi phải giả định rằng vấn đề nằm trong mã của bạn. "cách hệ điều hành xử lý Intent và toàn bộ cơ chế hoạt động" là một chủ đề vô cùng phức tạp, có thể là hàng chục trang, và có thể không liên quan gì đến vấn đề thực tế trong tầm tay. – CommonsWare

Trả lời

3

Trước hết, tôi thà khuyên để ràng buộc các dịch vụ và sau đó sử dụng Handlers cho IPC. Một ví dụ tốt có thể được tìm thấy ở đây: http://developer.android.com/guide/components/bound-services.html Điều này nhanh hơn và đáng tin cậy hơn rất nhiều.

Về cách Intents làm việc trong nội bộ bạn có thể có một cái nhìn vào mã nguồn: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ContextImpl.java#L893

1

Một lý do có thể là liên lạc giữa các quá trình Android là đồng bộ. Quá trình gọi điện thoại của khách hàng bị chặn trong suốt thời gian trả lời của quy trình máy chủ. Dịch vụ của bạn với bộ hẹn giờ bị chặn trong khoảng thời gian (rất nhỏ), điều này có thể dẫn đến hành vi bạn đã quan sát.

Nguồn: Android Binder - Android Interprocess Communication by Thorsten Schreiber, p 11 - 13.

EDIT: Tôi đã giữ câu trả lời công bố vì bình luận João Nunes của Chris Stratton và có giá trị.

+0

Thực ra, "quá trình khách hàng gọi điện" không bị chặn.Có một sự khác biệt quan trọng giữa hoạt động/dịch vụ, quy trình và chuỗi. Trong khi thread gọi một API cụ thể có thể chặn, các luồng khác của quá trình là * không * bị chặn, miễn là quá trình tồn tại và chúng không phải (do sự lựa chọn riêng của chúng) chờ trả lại các cuộc gọi hệ thống chặn (trực tiếp, hoặc bằng cách gọi các API nền tảng mà cuối cùng là). –

+0

Khi chúng ta gửi các ý định bằng cách sử dụng phương thức sendBroadcast(), có không đồng bộ - ít nhất là nó được viết ở các nhà phát triển Android. Nhưng câu trả lời của bạn có thể khiến tôi có một ý kiến ​​khác về cách toàn bộ quá trình triển khai hoạt động. Nó có thể được rằng các máy thu phát sóng đang bận rộn và hệ điều hành loại bỏ ý định bởi vì họ không thể được gửi đến người nhận phát sóng phóng viên? –

+0

@Chris Stratton cảm ơn vì đã làm rõ. Sự hiểu biết của tôi là IPC giữa các quá trình khác nhau là đồng bộ, dựa trên nguồn tôi liên kết đến, trong khi nhận xét của bạn đề cập đến các luồng khác nhau (và không nhất thiết là các quy trình khác nhau). Vì vậy, nếu các dịch vụ trong các quy trình khác nhau, giao tiếp sẽ được đồng bộ, nhưng nếu chúng nằm trong các luồng khác nhau trong cùng một quá trình truyền thông thì không đồng bộ. Đánh giá cao quan điểm của bạn về điều này. –

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