Tài liệu này đề cập đến hai khía cạnh có thể gây rắc rối.
Trạng thái. Với "Medialayer", một số thao tác chỉ hợp lệ ở một số trạng thái cụ thể. Các thao tác không chính xác có thể gây ra 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 hế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 lưu ý khi viết mã, vì một số thao tác chỉ hợp lệ khi trình phát ở một số 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 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 về lớp MediaPlayer
làm rõ 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 Rảnh. - Bạn khởi chạy lớp này bằng cách gọi
setDataSource()
. Thao tác này sẽ thay đổi lớp thành trạng thái Đã khởi chạy. - Bạn chuẩn bị thông tin này bằng phương thức
prepare()
hoặcprepareAsync()
. - Khi
MediaPlayer
hoàn tất việc chuẩn bị, nó sẽ chuyển sang trạng tháiPrepared
. Điều này có nghĩa là bạn có thể gọistart()
để phát nội dung nghe nhìn.
Tại thời điểm đó, như sơ đồ minh hoạ, bạn có thể di chuyển giữa các trạng thái Started
, Paused
và PlaybackCompleted
bằng cách gọi các phương thức như start()
, pause()
và seekTo()
, v.v.
Tuy nhiên, khi gọi stop()
, hãy lưu ý rằng bạn không thể gọi lại start()
cho đến khi 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 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
MediaPlayer
có thể tiêu tốn tài nguyên hệ thống có giá trị. Do đó, bạn luôn phải cẩn thận để đảm bảo không giữ một thực thể MediaPlayer
lâu hơn mức cần thiết. Khi hoàn tất, 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 ứng dụng đó đều được giải phóng đúng cách.
Ví dụ: nếu đang sử dụng MediaPlayer
và hoạt động của bạn nhận được lệnh gọi đến onStop()
, bạn phải giải phóng MediaPlayer
, vì việc giữ lại MediaPlayer
trong khi hoạt động của bạn không tương tác với người dùng là không hợp lý (trừ khi bạn đang phát nội dung nghe nhìn ở chế độ nền, như được thảo luận trong phần tiếp theo).
Tất nhiên, khi hoạt động của bạn được tiếp tục hoặc khởi động lại, 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 huỷ bỏ 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 phát hành MediaPlayer
khi hoạt động của bạn dừng, nhưng 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 tiêu thụ 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à ngang, vì tại 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 thời gian chạy, hãy xem phần Xử lý các thay đổi về thời gian chạy.
Bạn có thể 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 ứng dụng Music tích hợp hoạt động. Trong trường hợp này, bạn cần một MediaPlayer
do 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 đa phương tiện trong ứng dụng của bạn. Hãy đọc thêm về giải pháp này.
Các trang này đề cập đến các chủ đề liên quan đến việc ghi âm, lưu trữ và phát âm thanh và video: