2013-03-27 42 views
12

Tôi đang tạo ứng dụng truyền nhạc từ máy chủ web. Ứng dụng có dịch vụ nền trước sử dụng MediaPlayer để phát lại.Một MediaPlayer có nên chạy trong chuỗi riêng biệt không?

Mã của tôi được dựa trên ví dụ này: http://developer.android.com/guide/topics/media/mediaplayer.html

Trong ví dụ này, không có gì được luồng ngoại trừ prepareAsync() gọi. Điều làm tôi bối rối là khi tôi đọc về lớp Dịch vụ, tôi tìm thấy thông tin này:

"Thận trọng: Dịch vụ không tạo chủ đề riêng và không chạy trong Điều này có nghĩa rằng, nếu dịch vụ của bạn sẽ thực hiện bất kỳ thao tác hoặc thao tác chặn CPU nào (chẳng hạn như phát lại hoặc nối mạng MP3), bạn nên tạo một chuỗi mới trong dịch vụ để thực hiện công việc đó Bằng cách sử dụng một chuỗi riêng biệt, bạn sẽ giảm nguy cơ lỗi ứng dụng không trả lời (ANR) và chủ đề chính của ứng dụng có thể vẫn dành riêng cho tương tác của người dùng với các hoạt động của bạn. "

Lý do tôi hỏi là ứng dụng một số lần (thường là khi mất kết nối) đóng băng giao diện người dùng khi phát trực tuyến âm thanh. Tôi hoàn toàn hiểu rằng giao diện người dùng bị đóng băng nếu dịch vụ đang làm cho công việc mãnh liệt của CPU, vì hoạt động và dịch vụ chạy trên cùng một luồng. Nhưng, tôi có nên mong đợi MediaPlayer trở nên mãnh liệt không? Nghĩa là, nó có nên chạy trên một sợi riêng biệt không?

+0

readh ere http://stackoverflow.com/questions/8915618/mediaplayer-in-separate-thread-vs-running-in-service-via-startforeground –

+1

Tôi chắc chắn sẽ khuyên bạn không nên thực hiện bất kỳ cuộc gọi chặn nào tới Audiomanager , MediaPlayer, AudioRecord, et al từ chủ đề chính của ứng dụng của bạn. Nếu hệ thống âm thanh tạm thời bị gián đoạn - hoặc dừng hoàn toàn phản hồi - vì lý do nào đó bạn sẽ chỉ kết thúc với ANR trong ứng dụng của mình và báo cáo lỗi không có khả năng hữu ích đối với bất kỳ ai. – Michael

+0

Cảm ơn bạn đã trả lời @Michael! Tôi hoàn toàn đồng ý với bạn về các cuộc gọi chặn đó sẽ chạy trong một chuỗi riêng biệt. Nhưng, tôi có nên mong đợi phát lại phương tiện truyền thông trở thành chặn không? Tôi chỉ không thể tìm được cách để biết liệu trình phát đa phương tiện có đang "chặn" hay những gì đang gây ra điều này hay không. Điều này chỉ xảy ra khi tôi đang truyền trực tuyến qua rtsp khi đi bằng xe hơi hoặc tàu hỏa. Có lẽ việc thay đổi tháp di động có thể là một vấn đề? Hiện tại, tôi đang dựa vào MediaPlayer để giải quyết điều đó, hầu như mọi lúc. – smult

Trả lời

-2

Không, nếu bạn đang thực hiện bất kỳ chuyển mạng nào, bạn nên giữ điều đó trong một chủ đề, trình phát đa phương tiện không phải là tài nguyên chuyên sâu. Giữ nó trên hoạt động của bạn.

+1

Bạn không muốn giữ mediaplayer trong một hoạt động vì nó sẽ chạy ngay cả khi hoạt động bị hủy. Bạn nên chạy nó trong một dịch vụ nền trước. – smult

0

Âm nhạc phát trực tuyến có thể khiến luồng chính dừng lại cho đến khi phát xong nhạc không? Đây có thể là lý do tại sao nó làm chậm nó xuống.

Tôi không có chuyên gia và hiện đang tự học, nhưng đáng để suy nghĩ.

12

Thật không may, gọi hàm chuẩn() chỉ đơn giản là không đủ tốt để tránh các lời nhắc ANR và ứng dụng của bạn bị treo trong vài giây, đặc biệt nếu bạn đang phát tệp từ mạng. Đặt cược tốt nhất của bạn là đặt cá thể MediaPlayer của bạn theo chủ đề riêng của nó, hoặc ít nhất là thực hiện các cuộc gọi chuyên sâu trong một Trình xử lý (như mediaplayer.start()). Tôi đã sử dụng MediaPlayer trong hơn một năm và tôi có thể nói với bạn rằng nó chắc chắn bị treo sau nhiều cuộc gọi khác nhau, tùy thuộc vào hoàn cảnh.

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