Skip to content

Commit 4ca65ef

Browse files
committed
Adapt VideoListSampleApp (kotlin) to better manage BrightcoveExoPlayerVideoView instances in order to avoid memory problems
1 parent 403d55b commit 4ca65ef

File tree

1 file changed

+24
-21
lines changed
  • brightcove-exoplayer-kotlin/VideoListSampleApp/src/main/java/com/brightcove/videolist

1 file changed

+24
-21
lines changed

brightcove-exoplayer-kotlin/VideoListSampleApp/src/main/java/com/brightcove/videolist/VideoListAdapter.kt

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.brightcove.videolist
22

3+
import android.util.SparseArray
34
import android.view.LayoutInflater
45
import android.view.ViewGroup
56
import androidx.recyclerview.widget.DiffUtil
@@ -8,29 +9,40 @@ import androidx.recyclerview.widget.RecyclerView
89
import com.brightcove.player.event.EventType
910
import com.brightcove.player.model.Video
1011
import com.brightcove.player.view.BrightcoveExoPlayerVideoView
11-
import com.brightcove.player.view.BrightcoveVideoView
1212
import com.brightcove.videolist.databinding.ItemViewBinding
1313

1414
class VideoListAdapter : ListAdapter<Video, VideoListAdapter.ViewHolder>(DIFF_CALLBACK) {
1515

16+
// This is used to keep track of the playback position for each video; remove it and its associated logic to play from the start always
17+
private val playheadPositions = SparseArray<Long>()
18+
1619
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
1720
val binding = ItemViewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
1821
return ViewHolder(binding)
1922
}
2023

2124
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
2225
//Get Video information
23-
holder.bind(getItem(position))
26+
val video = getItem(position)
27+
holder.video = video
28+
holder.binding.videoTitleText.text = video.getStringProperty(Video.Fields.NAME)
2429
}
2530

2631
override fun onViewAttachedToWindow(holder: ViewHolder) {
2732
super.onViewAttachedToWindow(holder)
28-
holder.videoView.start()
33+
holder.video?.let { video ->
34+
holder.videoView.add(video)
35+
holder.videoView.seekTo(playheadPositions.get(holder.absoluteAdapterPosition, 0L))
36+
holder.videoView.start()
37+
}
2938
}
3039

3140
override fun onViewDetachedFromWindow(holder: ViewHolder) {
3241
super.onViewDetachedFromWindow(holder)
42+
playheadPositions.put(holder.absoluteAdapterPosition, holder.videoView.currentPositionLong)
3343
holder.videoView.stopPlayback()
44+
holder.videoView.clear()
45+
holder.videoView.playback.destroyPlayer()
3446
}
3547

3648
override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {
@@ -43,29 +55,20 @@ class VideoListAdapter : ListAdapter<Video, VideoListAdapter.ViewHolder>(DIFF_CA
4355
}
4456
}
4557

46-
class ViewHolder (private val binding: ItemViewBinding
58+
class ViewHolder (val binding: ItemViewBinding
4759
) : RecyclerView.ViewHolder(binding.root) {
4860

49-
lateinit var videoView: BrightcoveVideoView
50-
51-
fun bind(video: Video){
61+
val videoView = BrightcoveExoPlayerVideoView(itemView.context)
62+
var video: Video? = null
5263

53-
binding.apply {
64+
init {
65+
binding.videoFrame.addView(videoView)
66+
videoView.finishInitialization()
5467

55-
videoView = BrightcoveExoPlayerVideoView(itemView.context)
56-
videoFrame.addView(videoView)
57-
videoView.finishInitialization()
58-
59-
val eventEmitter = videoView.eventEmitter
60-
eventEmitter.on(EventType.ENTER_FULL_SCREEN) {
61-
//You can set listeners on each Video View
62-
}
63-
64-
videoTitleText.text = video.getStringProperty(Video.Fields.NAME)
65-
videoView.clear()
66-
videoView.add(video)
68+
val eventEmitter = videoView.eventEmitter
69+
eventEmitter.on(EventType.ENTER_FULL_SCREEN) {
70+
//You can set listeners on each Video View
6771
}
68-
6972
}
7073
}
7174

0 commit comments

Comments
 (0)