Quản lý trạng thái và tài nguyên MediaPlayer

Tài liệu này đề cập đến 2 lĩnh vực có thể gặp phải vấn đề.

  • Tiểu bang. Với "Medialayer", một số thao tác chỉ hợp lệ ở các trạng thái cụ thể. Các thao tác không chính xác có thể gây ra các trường hợp ngoại lệ hoặc hành vi không mong muốn.

  • Tài nguyên Khi thực hiện các thay đổi về cấu hình, chẳng hạn như xoay màn hình, bạn phải giải phóng đối tượng MediaPlayer để giải phóng tài nguyên hệ thống và tránh tình trạng cạn kiệt tài nguyên.

Quản lý trạng thái

MediaPlayer dựa trên trạng thái. Tức là trình phát có một trạng thái nội bộ mà bạn phải luôn biết khi viết mã, vì một số thao tác chỉ hợp lệ khi trình phát ở trạng thái cụ thể. Nếu bạn thực hiện một thao tác trong khi ở trạng thái không chính xác, hệ thống có thể gửi ra một ngoại lệ hoặc gây ra các hành vi không mong muốn khác.

Sơ đồ trạng thái trong tài liệu lớp MediaPlayer làm rõ những phương thức nào di chuyển MediaPlayer từ trạng thái này sang trạng thái khác. Ví dụ:

  • Khi bạn tạo một MediaPlayer mới, MediaPlayer đó sẽ ở trạng thái Không hoạt động.
  • Bạn khởi chạy bằng cách gọi setDataSource(), thao tác này sẽ thay đổi thành trạng thái Đã khởi chạy.
  • Bạn chuẩn bị bằng phương thức prepare() hoặc prepareAsync().
  • Khi MediaPlayer chuẩn bị xong, nó sẽ chuyển sang trạng thái Prepared, nghĩa là bạn có thể gọi start() để phát nội dung nghe nhìn.

Tại thời điểm đó, như minh hoạ trong sơ đồ, bạn có thể di chuyển giữa các trạng thái Started, PausedPlaybackCompleted bằng cách gọi các phương thức như start(), pause()seekTo(), cùng nhiều phương thức khác.

Tuy nhiên, khi bạn gọi stop(), hãy lưu ý rằng bạn không thể gọi lại start() cho đến khi bạn chuẩn bị lại MediaPlayer.

Luôn ghi nhớ sơ đồ trạng thái khi viết mã tương tác với đối tượng MediaPlayer, vì việc gọi các phương thức của đối tượng này từ trạng thái không chính xác là nguyên nhân phổ biến gây ra lỗi.

Giải phóng MediaPlayer

Một MediaPlayer có thể tiêu thụ tài nguyên hệ thống có giá trị. Do đó, bạn phải luôn thực hiện các biện pháp phòng ngừa bổ sung để đảm bảo rằng bạn không giữ một phiên bản MediaPlayer lâu hơn mức cần thiết. Khi dùng xong, bạn phải luôn gọi release() để đảm bảo mọi tài nguyên hệ thống được phân bổ cho đối tượng đó đều được giải phóng đúng cách.

Ví dụ: nếu bạn đang sử dụng MediaPlayer và hoạt động của bạn nhận được một lệnh gọi đến onStop(), bạn phải giải phóng MediaPlayer, vì việc giữ lại MediaPlayer khi hoạt động của bạn không tương tác với người dùng là điều không hợp lý (trừ phi bạn đang phát nội dung nghe nhìn ở chế độ nền, điều này sẽ được thảo luận trong phần tiếp theo).

Khi hoạt động của bạn được tiếp tục hoặc khởi động lại, tất nhiên, bạn cần tạo một MediaPlayer mới và chuẩn bị lại trước khi tiếp tục phát.

Sau đây là cách bạn nên phát hành rồi vô hiệu hoá MediaPlayer:

Kotlin

mediaPlayer?.release()
mediaPlayer = null

Java

mediaPlayer.release();
mediaPlayer = null;

Ví dụ: hãy xem xét các vấn đề phát sinh nếu bạn quên giải phóng MediaPlayer khi hoạt động của bạn dừng, nhưng lại tạo một MediaPlayer mới khi hoạt động bắt đầu lại. Khi người dùng thay đổi hướng màn hình (hoặc thay đổi cấu hình thiết bị theo cách khác), theo mặc định, hệ thống sẽ khởi động lại hoạt động. Bạn có thể nhanh chóng sử dụng hết tất cả tài nguyên hệ thống khi người dùng xoay thiết bị qua lại giữa hướng dọc và hướng ngang, vì ở mỗi lần thay đổi hướng, bạn sẽ tạo một MediaPlayer mới mà bạn không bao giờ phát hành.

Để biết thêm thông tin về việc khởi động lại khi bắt đầu chạy, hãy xem phần Xử lý thay đổi thời gian chạy.

Có thể bạn đang thắc mắc điều gì sẽ xảy ra nếu bạn muốn tiếp tục phát "nội dung nghe nhìn ở chế độ nền" ngay cả khi người dùng rời khỏi hoạt động của bạn, tương tự như cách hoạt động của ứng dụng Nhạc tích hợp. Trong trường hợp này, bạn cần một MediaPlayer do một Dịch vụ kiểm soát, như thảo luận trong phần tiếp theo

Tìm hiểu thêm

Jetpack Media3 là giải pháp được đề xuất để phát nội dung nghe nhìn trong ứng dụng của bạn. Đọc thêm về giải pháp này.

Những trang này đề cập đến các chủ đề liên quan đến việc ghi, lưu trữ và phát âm thanh cũng như video: