Quản lý và phát nội dung

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 đề cập đến các chủ đề sau:

Thêm 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 với video đang phát. 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 sau này.

Việc thêm các mục nội dung nghe nhìn không tự động khiến trình quản lý tải trước bắt đầu tải nội dung. Để kích hoạt quá trình tải trước, bạn cần vô hiệu hoá 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[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 sẵn 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 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 tối đa 20 mục.
  • preloadManagerDefaultPreloadManager được tạo trong phần Tạo DefaultPreloadManager. Mã này gọi phương thức add() của trình quản lý đó để thêm từng mục trong băng chuyền.
  • rankingData là một 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ới DefaultPreloadManager, rankingData là một số nguyên đại diện cho vị trí của mục trong băng chuyền. Trình quản lý tải trước xác định mức độ ưu tiên bằng cách tính khoảng cách của từng mục so với mục đang phát.

Vô hiệu hoá 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á mục nội dung nghe nhìn. Nếu bạn đ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ục khác. Trong trường hợp này, bạn nên 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 cần tải bao nhiêu nội dung từ mỗi mục. Sau đó, trình quản lý này sẽ tải nội dung cho từng mục theo thứ tự ưu tiên từ cao xuống 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 bạn đang 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 việc thực hiện các thay đổi trước khi gọi invalidate().

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 trường hợp 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)
} else {
  // If mediaSource is null, that mediaItem hasn't been added to the preload manager
  // yet. So, send it directly to the player when it's about to play
  player.setMediaItem(mediaItem)
}
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à Media3 ExoPlayer 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ọi DefaultPreloadManager.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ý này sẽ trả về một MediaSource 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 nhanh đến 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 cập nhật chỉ mục hiện tại, hãy gọi invalidate() để 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á các mục mà trình quản lý tải trước không còn cần theo dõi. Bạn cũng có thể xoá các 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ì không cần tải trước mục đó. Trong trường hợp đó, bạn sẽ xoá các mục khi chúng ở xa như vậy. Nếu người dùng di chuyển trở lại các 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ã

Giải phóng trình quản lý tải trước khi bạn dùng xong

Khi không còn 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ớ giải phóng trình quản lý này 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 giải phóng đối tượng đó.
  • 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 tạo đó để tạo DefaultPreloadManager. Đừng cố gắng sử dụng lại trình tạo cũ.