Trang này mô tả cách sử dụng trình quản lý tải trước để quản lý nội dung video. Bằng cách sử dụng trình quản lý tải trước, bạn có thể mang lại trải nghiệm tốt hơn cho người dùng; khi người dùng chuyển từ một mục nội dung nghe nhìn sang mục khác, quá trình phát sẽ bắt đầu nhanh hơn vì trình quản lý đã tải một số nội dung.
Trang này trình bày các chủ đề sau:
- Thêm các mục nội dung nghe nhìn vào trình quản lý tải trước
- Vô hiệu hoá các mức độ ưu tiên trong trình quản lý tải trước
- Tìm nạp và phát nội dung nghe nhìn
- Xoá các mục khỏi trình quản lý tải trước
- Giải phóng trình quản lý tải trước khi bạn dùng xong
Thêm các mục nội dung nghe nhìn vào trình quản lý tải trước
Bạn phải cho trình quản lý tải trước biết về từng mục nội dung nghe nhìn mà trình quản lý này sẽ theo dõi. Ví dụ: nếu ứng dụng của bạn có một băng chuyền video, bạn sẽ thêm những video đó vào trình quản lý tải trước. Tuỳ thuộc vào trường hợp sử dụng, bạn có thể thêm tất cả video hoặc chỉ thêm tất cả video gần video đang phát. Sau này, bạn cũng có thể thêm các mục mới vào trình quản lý tải trước.
Bản thân việc thêm các mục nội dung đa phương tiện không khiến trình quản lý tải trước bắt đầu tải nội dung. Để kích hoạt tính năng tải trước, bạn cần vô hiệu hoá các mức độ ưu tiên trong trình quản lý tải trước.
val initialMediaItems = pullMediaItemsFromService(/* count= */ 20);
for (index in 0 until initialMediaItems.size) {
preloadManager.add(initialMediaItems.get(index), /* rankingData= */ index)
}
// items aren't actually loaded yet! need to call invalidate() after this
Các điểm chính về mã
- Đoạn mã này cho biết cách điền thông tin ban đầu vào trình quản lý tải trước sau khi bạn tạo trình quản lý này. Bạn cũng có thể gọi
add()
để thêm các mục vào một trình quản lý tải trước hiện có đã được điền sẵn. - Trong đoạn mã này,
pullMediaItemsFromService()
là logic của ứng dụng để tìm nạp danh sách nội dung cần phát. Mã này gọi phương thức đó để tìm nạp danh sách gồm tối đa 20 mục. preloadManager
làDefaultPreloadManager
được tạo trong Tạo mộtDefaultPreloadManager
. Mã này gọi phương thứcadd()
của trình quản lý đó để thêm từng mục vào băng chuyền.rankingData
là giá trị mà trình quản lý tải trước dùng để xác định mức độ ưu tiên của từng mục nội dung nghe nhìn. Đối vớiDefaultPreloadManager
,rankingData
là một số nguyên biểu thị vị trí của mặt hàng trong băng chuyền. Trình quản lý tải trước xác định mức độ ưu tiên dựa trên khoảng cách của từng mục so với mục đang phát.
Huỷ các mức độ ưu tiên trong trình quản lý tải trước
Để kích hoạt trình quản lý tải trước bắt đầu tải trước nội dung, bạn cần gọi invalidate()
để cho trình quản lý tải trước biết rằng mức độ ưu tiên của các mục đã lỗi thời. Bạn nên thực hiện việc này trong các trường hợp sau:
- Khi bạn thêm mục nội dung nghe nhìn mới vào trình quản lý tải trước hoặc xoá các mục nội dung nghe nhìn.
Nếu đang thêm hoặc xoá một số mục, bạn nên thêm tất cả các mục đó, sau đó gọi
invalidate()
. - Khi người dùng chuyển từ một mục nội dung nghe nhìn sang một mục khác. Trong trường hợp này, bạn phải nhớ cập nhật chỉ mục phát hiện tại trước khi gọi
invalidate()
, như mô tả trong phần Tìm nạp và phát nội dung.
Khi bạn vô hiệu hoá trình quản lý tải trước, trình quản lý này sẽ gọi TargetPreloadStatusControl
mà bạn đã tạo để tìm hiểu xem trình quản lý nên tải bao nhiêu nội dung từ mỗi mục. Sau đó, nó sẽ tải nội dung cho từng mục theo thứ tự ưu tiên từ cao đến thấp.
preloadManager.invalidate()
Các điểm chính về mã
- Việc gọi
invalidate()
sẽ kích hoạt trình quản lý tải trước để đánh giá lại mức độ ưu tiên của từng mục nội dung nghe nhìn mà trình quản lý này biết. Vì lý do này, nếu thực hiện nhiều thay đổi đối với trình quản lý tải trước, bạn nên hoàn tất các thay đổi trước khi gọiinvalidate()
.
Tìm nạp và phát nội dung nghe nhìn
Khi người dùng chuyển sang một mục nội dung nghe nhìn mới, bạn cần lấy mục nội dung nghe nhìn đó từ trình quản lý tải trước. Nếu trình quản lý tải trước đã tải bất kỳ nội dung nào, thì nội dung sẽ phát nhanh hơn so với khi bạn không sử dụng trình quản lý tải trước. Nếu trình quản lý tải trước chưa tải nội dung từ mục đó, thì nội dung sẽ phát bình thường.
// When a media item is about to display on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
player.setMediaSource(mediaSource)
}
player.prepare()
// When the media item is displaying at the center of the screen
player.play()
preloadManager.setCurrentPlayingIndex(currentIndex)
// Need to call invalidate() to update the priorities
preloadManager.invalidate()
Các điểm chính về mã
player
là Media3ExoPlayer
mà ứng dụng đang dùng để phát nội dung. Bạn phải tạo trình phát đó bằng cách gọiDefaultPreloadManager.Builder.buildExoPlayer()
trên cùng một trình tạo mà bạn đã dùng để tạo trình quản lý tải trước.- Khi người dùng chuyển sang một mục nội dung nghe nhìn mới, ứng dụng sẽ gọi
getMediaSource()
để lấy nguồn nội dung nghe nhìn từ trình quản lý tải trước. Đây phải làmediaItem
mà bạn đã thêm vào trình quản lý tải trước. Không sao nếu trình quản lý tải trước chưa bắt đầu tải nội dung; trong trường hợp đó, trình quản lý sẽ trả về mộtMediaSource
không có dữ liệu được tải trước. Ví dụ: điều này có thể xảy ra nếu người dùng đột ngột chuyển sang một vị trí xa trong băng chuyền. - Sau khi người dùng phát mục nội dung nghe nhìn mới, hãy gọi
setCurrentPlayingIndex
để cho trình quản lý tải trước biết vị trí của mục mới trong băng chuyền. Trình quản lý tải trước cần thông tin đó để ưu tiên tải mục tiếp theo. Sau khi bạn cập nhật chỉ mục hiện tại, hãy gọiinvalidate()
để trình quản lý tải trước xác định lại mức độ ưu tiên cho từng mục.
Xoá các mục khỏi trình quản lý tải trước
Để duy trì hiệu quả của trình quản lý tải trước, bạn nên xoá những mục mà trình quản lý tải trước không cần theo dõi nữa. Bạn cũng có thể xoá những mục vẫn còn trong băng chuyền nhưng ở xa vị trí hiện tại của người dùng. Ví dụ: bạn có thể quyết định rằng nếu một mục cách xa hơn 15 mục so với nội dung mà người dùng đang xem, thì mục đó không cần được tải trước. Trong trường hợp đó, bạn sẽ xoá các mục khi chúng ở quá xa. Nếu người dùng di chuyển trở lại những mục đã xoá đó, bạn luôn có thể thêm lại các mục đó.
preloadManager.remove(mediaItem)
Các điểm chính về mã
- Nếu muốn xoá tất cả các mục khỏi trình quản lý tải trước, bạn có thể gọi
reset()
thay vìremove()
. Phương pháp này sẽ hữu ích nếu bạn cần thay đổi tất cả các mục trong băng chuyền. Trong trường hợp đó, sau khi xoá các mục, bạn sẽ cần thêm các mục mới vào trình quản lý tải trước rồi vô hiệu hoá các mức độ ưu tiên trong trình quản lý tải trước.
Phát hành trình quản lý tải trước khi bạn hoàn tất
Khi không cần trình quản lý tải trước nữa, bạn phải giải phóng trình quản lý này để giải phóng tài nguyên của trình quản lý. Đặc biệt, hãy nhớ phát hành nó khi hoạt động của bạn bị huỷ.
preloadManager.release()
Các điểm chính về mã
- Bạn không được gọi bất kỳ phương thức nào của đối tượng sau khi phát hành.
- Nếu cần tạo một trình quản lý tải trước khác, hãy tạo một
DefaultPreloadManager.Builder
mới và dùng trình quản lý đó để tạoDefaultPreloadManager
. Đừng cố gắng sử dụng lại trình tạo cũ.