2012-08-08 42 views
7

Thực hiện cuộc gọi tới REST WebService trong lớp Dịch vụ của ứng dụng Android của tôi tạo NetworkOnMainThreadException.Android: sử dụng mạng trong dịch vụ

Tôi hiểu lý do ngoại lệ này được nêu trong một Hoạt động: tìm nạp thứ gì đó qua mạng đồng bộ là một thực tế cực kỳ tệ nhưng tôi ngạc nhiên khi thấy cùng một lỗi trong một Lớp dịch vụ. Vì vậy, câu hỏi của tôi là:

-Trong trường hợp cụ thể này, tôi nên sử dụng StrictMode.setThreadPolicy() để cho phép cuộc gọi này. (Và đối với những người đọc điều này vì họ gặp phải lỗi này trong hoạt động, không sử dụng StrictMode để ẩn lỗi này, hãy sử dụng AsyncTask)

- tôi có nên sử dụng AsyncTask không? Và trong trường hợp đó, vấn đề ở đây là gì? Không phải là dịch vụ trên một sợi được tách khỏi một hoạt động?

Trả lời

12

Mặc dù Service được thiết kế để xử lý nền chúng chạy trong chủ đề chính chính.

Một câu nói ngắn từ documentation:

Chú ý: Một dịch vụ chạy trong quá trình tương tự như các ứng dụng, trong đó nó được khai báo và trong các chủ đề chính của ứng dụng đó, theo mặc định. Vì vậy, nếu dịch vụ của bạn thực hiện các hoạt động chuyên sâu hoặc chặn trong khi người dùng tương tác với một hoạt động từ cùng một ứng dụng, dịch vụ sẽ làm chậm hiệu suất hoạt động. Để tránh ảnh hưởng đến hiệu suất ứng dụng, bạn nên bắt đầu một chuỗi mới bên trong dịch vụ.

'Xử lý nền' có nghĩa là dịch vụ không có giao diện người dùng, nó có thể chạy ngay cả khi người dùng không tương tác trực tiếp với ứng dụng. Nhưng tất cả quá trình xử lý nền vẫn xảy ra trong chuỗi chính theo mặc định.

Vì vậy, cách giải quyết và loại bỏ ngoại lệ? Vì tài liệu cho thấy bạn phải sử dụng chuỗi nền. Trong dịch vụ của bạn, bạn có thể sử dụng AsyncTask hoặc tạo chủ đề trực tiếp. Nhưng tôi đoán IntentService có thể phù hợp nhất trong trường hợp của bạn. IntentService xử lý các yêu cầu trong chuỗi nền (vì vậy đó là loại dịch vụ bạn đang tìm kiếm).

+0

Cảm ơn câu trả lời của bạn, vì vậy đó là những gì tôi nghi ngờ. Tôi giả định rằng vì chúng được sử dụng cho các nhiệm vụ nền, các dịch vụ sẽ mặc định trên một luồng khác, nhưng nó không phải là trường hợp. Thực ra tôi sử dụng dịch vụ đó để quản lý các cuộc gọi đến 'MediaPlayer', vì vậy việc sử dụng dịch vụ này trên chủ đề chính không có vẻ như là vấn đề vì 'PrepareAsync()' cho phép tôi quản lý hành vi của nó một cách thanh lịch. Tôi sẽ chỉ phải sửa đổi dịch vụ của mình để sử dụng 'AsyncTask' để nhận url phát trực tuyến. – Teovald

+1

Câu trả lời hay, cũng có các tài liệu sẵn có sẽ giúp bạn hiểu cách sử dụng mạng hiệu quả, để đảm bảo ứng dụng của bạn được tối ưu hóa. http://developer.att.com/developer/forward.jsp?passedItemId=7200042 –

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