解决视频播放内存泄漏

This commit is contained in:
yangyakun
2022-06-27 17:56:00 +08:00
parent 47bbeb6cef
commit fc692406e3
9 changed files with 77 additions and 76 deletions

View File

@@ -207,7 +207,7 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener {
val commentAdapter = rvCommentList.adapter as CommentAdapter
val selectComment = commentAdapter.getSelectComment()
if(selectComment.isEmpty()){
ToastUtils.showLong("请选择评内容")
ToastUtils.showLong("请选择评内容")
return
}
iTaxiPassengerScoreCallback?.onScoreCallback(TaxiPassengerScoreUpdateOrderReqBean(orderNo,currentFraction,selectComment))

View File

@@ -20,7 +20,6 @@ import com.mogo.och.taxi.passenger.utils.windowdispatch.ReflectionUtils
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import java.lang.ref.WeakReference
import java.util.concurrent.TimeUnit
/**
@@ -50,8 +49,8 @@ object OverlayLeftViewUtils {
private var subscribe: Disposable?=null
private var taxiPassengerMogoConsultView: WeakReference<TaxiPassengerMogoConsultView>? = null
private var taxiPassengerMogoMoviesView: WeakReference<TaxiPassengerMogoMoviesView>? = null
private var taxiPassengerMogoConsultView: TaxiPassengerMogoConsultView? = null
private var taxiPassengerMogoMoviesView: TaxiPassengerMogoMoviesView? = null
/**
* 添加覆盖View在Activity上面
@@ -100,7 +99,7 @@ object OverlayLeftViewUtils {
val liveSelected = object :ListAdapter.OnTabSelectListener{
override fun onSelect(v: View?) {
close(view, windowManager)
FullVideoUtils.dismissOverlayView()
FullVideoUtils.dismissOverlayView(true)
closeConsult()
closeMovice()
}
@@ -109,30 +108,20 @@ object OverlayLeftViewUtils {
val consultSelect = object :ListAdapter.OnTabSelectListener{
override fun onSelect(v: View?) {
close(view, windowManager)
FullVideoUtils.dismissOverlayView()
FullVideoUtils.dismissOverlayView(true)
closeMovice()
if(taxiPassengerMogoConsultView?.get() != null){
OverlayViewUtils.showOverlayView(context,taxiPassengerMogoConsultView?.get())
}else{
taxiPassengerMogoConsultView =
WeakReference<TaxiPassengerMogoConsultView>(TaxiPassengerMogoConsultView(context))
OverlayViewUtils.showOverlayView(context,taxiPassengerMogoConsultView?.get())
}
taxiPassengerMogoConsultView = TaxiPassengerMogoConsultView(context)
OverlayViewUtils.showOverlayView(context,taxiPassengerMogoConsultView)
}
}
val entertainmentSelect = object :ListAdapter.OnTabSelectListener{
override fun onSelect(v: View?) {
close(view, windowManager)
FullVideoUtils.dismissOverlayView()
FullVideoUtils.dismissOverlayView(true)
closeConsult()
if(taxiPassengerMogoMoviesView?.get() != null){
OverlayViewUtils.showOverlayView(context,taxiPassengerMogoMoviesView?.get())
}else{
taxiPassengerMogoMoviesView =
WeakReference<TaxiPassengerMogoMoviesView>(TaxiPassengerMogoMoviesView(context))
OverlayViewUtils.showOverlayView(context,taxiPassengerMogoMoviesView?.get())
}
taxiPassengerMogoMoviesView = TaxiPassengerMogoMoviesView(context)
OverlayViewUtils.showOverlayView(context,taxiPassengerMogoMoviesView)
}
}
@@ -198,7 +187,7 @@ object OverlayLeftViewUtils {
/**
* 关闭状态栏
*/
fun close(overlayView: View,windowManager: WindowManager?) {
private fun close(overlayView: View,windowManager: WindowManager?) {
params?.x = DEVIATION_WIDTH
windowManager?.updateViewLayout(overlayView, params)
}
@@ -235,7 +224,7 @@ object OverlayLeftViewUtils {
if (!isShowing) {
return
}
FullVideoUtils.dismissOverlayView()
FullVideoUtils.dismissOverlayView(true)
// 管理的要关闭都得关闭
closeConsult()
closeMovice()
@@ -259,17 +248,15 @@ object OverlayLeftViewUtils {
}
private fun closeMovice() {
if (taxiPassengerMogoMoviesView?.get() != null) {
OverlayViewUtils.dismissOverlayView(taxiPassengerMogoMoviesView?.get())
taxiPassengerMogoMoviesView = null
}
OverlayViewUtils.dismissOverlayView(taxiPassengerMogoMoviesView)
taxiPassengerMogoMoviesView= null
System.gc()
}
private fun closeConsult() {
if (taxiPassengerMogoConsultView?.get() != null) {
OverlayViewUtils.dismissOverlayView(taxiPassengerMogoConsultView?.get())
taxiPassengerMogoConsultView = null
}
OverlayViewUtils.dismissOverlayView(taxiPassengerMogoConsultView)
taxiPassengerMogoConsultView = null
System.gc()
}
private fun getViewBounds(view: View): Rect {

View File

@@ -5,7 +5,8 @@ import android.app.Activity
import android.content.Context
import android.view.View
import android.view.WindowManager
import com.mogo.och.taxi.passenger.ui.video.FullVideoUtils
import com.mogo.och.taxi.passenger.widget.ConsultVideoPlayer
import com.shuyu.gsyvideoplayer.GSYVideoManager
import java.lang.Exception
/**
@@ -69,10 +70,19 @@ object FullVideoUtils {
/**
* 移除覆盖View在Activity上面
*/
fun dismissOverlayView() {
fun dismissOverlayView(needReleas:Boolean) {
if (!isShowing) {
return
}
val consultVideoPlayer =
lastOverlayView?.findViewById<ConsultVideoPlayer>(GSYVideoManager.FULLSCREEN_ID)
consultVideoPlayer?.let {
if(needReleas){
it.onVideoReset()
it.setVideoAllCallBack(null)
it.smalllPlayer?.clearFullscreenLayout(it)
}
}
try {
if (windowManager != null) {
windowManager!!.removeView(lastOverlayView)

View File

@@ -47,7 +47,6 @@ class TaxiPassengerMogoConsultView :RelativeLayout {
constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes)
private lateinit var rvVideoPlaylist: RecyclerView
private lateinit var indicatorView: IndicatorView
private lateinit var clContain: ConstraintLayout
@@ -85,12 +84,19 @@ class TaxiPassengerMogoConsultView :RelativeLayout {
if(prePlayerPosition!=centerItemPosition) {
if(player.currentState==GSYVideoView.CURRENT_STATE_PAUSE){
player.onVideoReset()
//player.startPlayLogic()
}else{
//player.startPlayLogic()
}
val prePlayer =
carouselLayoutManager.findViewByPosition(prePlayerPosition)
prePlayer?.let {
if(it is ConsultVideoPlayer){
it.onVideoReset()
}
}
val taxiPassengerVideoPlay = arrayListOf[centerItemPosition]
setBackageAndPlayNext(taxiPassengerVideoPlay, player, centerItemPosition)
if (player.getVideoAllCallBack()==null) {
setBackageAndPlayNext(taxiPassengerVideoPlay, player, centerItemPosition)
}
}else{
player.onVideoResume(false)
}
@@ -237,19 +243,16 @@ class TaxiPassengerMogoConsultView :RelativeLayout {
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
val carouselLayoutManager = rvVideoPlaylist.layoutManager as CarouselLayoutManager
val centerItemPosition: Int = carouselLayoutManager.centerItemPosition
val player = carouselLayoutManager.findViewByPosition(centerItemPosition)
player?.let {
if(player is ConsultVideoPlayer){
player.release()
player.currentPlayer.release()
player.onVideoReset()
}
}
}
companion object {
const val TAG = "TaxiPassengerMogoConsultView"
super.onDetachedFromWindow()
}
init {

View File

@@ -47,7 +47,6 @@ class TaxiPassengerMogoMoviesView :RelativeLayout {
constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes)
private lateinit var rvVideoPlaylist: RecyclerView
private lateinit var indicatorView: IndicatorView
private lateinit var clContain: ConstraintLayout
@@ -85,12 +84,19 @@ class TaxiPassengerMogoMoviesView :RelativeLayout {
if(prePlayerPosition!=centerItemPosition) {
if(player.currentState==GSYVideoView.CURRENT_STATE_PAUSE){
player.onVideoReset()
//player.startPlayLogic()
}else{
//player.startPlayLogic()
}
val prePlayer =
carouselLayoutManager.findViewByPosition(prePlayerPosition)
prePlayer?.let {
if(it is ConsultVideoPlayer){
it.onVideoReset()
}
}
val taxiPassengerVideoPlay = arrayListOf[centerItemPosition]
setBackageAndPlayNext(taxiPassengerVideoPlay, player, centerItemPosition)
if (player.getVideoAllCallBack()==null) {
setBackageAndPlayNext(taxiPassengerVideoPlay, player, centerItemPosition)
}
}else{
player.onVideoResume(false)
}
@@ -237,19 +243,16 @@ class TaxiPassengerMogoMoviesView :RelativeLayout {
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
val carouselLayoutManager = rvVideoPlaylist.layoutManager as CarouselLayoutManager
val centerItemPosition: Int = carouselLayoutManager.centerItemPosition
val player = carouselLayoutManager.findViewByPosition(centerItemPosition)
player?.let {
if(player is ConsultVideoPlayer){
player.release()
player.currentPlayer.release()
player.onVideoReset()
}
}
}
companion object {
const val TAG = "TaxiPassengerMogoConsultView"
super.onDetachedFromWindow()
}
init {

View File

@@ -40,7 +40,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
private lateinit var layoutBottom: ConstraintLayout
private var fullVideoPlayer:ConsultVideoPlayer?=null
private var smalllPlayer:ConsultVideoPlayer?=null
var smalllPlayer:ConsultVideoPlayer?=null
private var currentTime = 0
@@ -119,21 +119,23 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
mProgressBar?.progress = 0
fullVideoPlayer?.let {
clearFullscreenLayout(it)
}
fullVideoPlayer = null
onVideoReset()
setVideoAllCallBack(null)
if(!isIfCurrentIsFullscreen) {
onVideoReset()
setVideoAllCallBack(null)
}
super.onDetachedFromWindow()
}
override fun onClick(v: View?) {
super.onClick(v)
when (v?.id) {
R.id.fullscreen -> {
startWindowFullscreenOwn(context, false, false)
startWindowFullscreenOwn(context)
}
R.id.aiv_start_play -> {
if(currentState==GSYVideoView.CURRENT_STATE_PAUSE){
@@ -184,7 +186,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
if(isIfCurrentIsFullscreen){
smalllPlayer?.clearFullscreenLayout(this)
smalllPlayer?.currentTime = -1
FullVideoUtils.dismissOverlayView()
FullVideoUtils.dismissOverlayView(false)
}
}
@@ -198,16 +200,16 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
override fun onSurfaceAvailable(surface: Surface) {
super.onSurfaceAvailable(surface)
if (GSYVideoType.getRenderType() != GSYVideoType.TEXTURE) {
// if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) {
// mThumbImageViewLayout.visibility = View.INVISIBLE
// }
if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) {
mThumbImageViewLayout.visibility = View.INVISIBLE
}
}
}
override fun onAutoCompletion() {
super.onAutoCompletion()
if(mIfCurrentIsFullscreen){
FullVideoUtils.dismissOverlayView()
FullVideoUtils.dismissOverlayView(false)
fullVideoPlayer?.let {
clearFullscreenLayout(it)
}
@@ -222,8 +224,8 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
}
}
private fun startWindowFullscreenOwn(context:Context, actionBar:Boolean, statusBar:Boolean){
val gsyBaseVideoPlayer = startWindowFullscreen(context, actionBar, statusBar)
private fun startWindowFullscreenOwn(context:Context){
val gsyBaseVideoPlayer = startWindowFullscreen(context)
gsyBaseVideoPlayer?.let {
val gsyVideoPlayer = it as StandardGSYVideoPlayer
gsyVideoPlayer.setLockClickListener(mLockClickListener)
@@ -257,8 +259,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
standardGSYVideoPlayer.titleTextView?.text = titleTextView.text
}
override fun startWindowFullscreen(context:Context, actionBar:Boolean, statusBar:Boolean):GSYBaseVideoPlayer?{
private fun startWindowFullscreen(context:Context):GSYBaseVideoPlayer?{
if (mTextureViewContainer.childCount > 0) {
mTextureViewContainer.removeAllViews()
}
@@ -299,7 +300,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
gsyVideoPlayer.fullscreenButton.setOnClickListener { v ->
if (mBackFromFullScreenListener == null) {
clearFullscreenLayout(gsyVideoPlayer)
FullVideoUtils.dismissOverlayView()
FullVideoUtils.dismissOverlayView(false)
} else {
mBackFromFullScreenListener.onClick(v)
}
@@ -330,11 +331,8 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
/**
* 全屏
*/
override fun resolveFullVideoShow(
context: Context?,
gsyVideoPlayer: GSYBaseVideoPlayer,
frameLayout: FrameLayout
) {
override fun resolveFullVideoShow(context: Context?, gsyVideoPlayer: GSYBaseVideoPlayer,
frameLayout: FrameLayout) {
val lp = gsyVideoPlayer.layoutParams as LayoutParams
lp.setMargins(0, 0, 0, 0)
lp.height = ViewGroup.LayoutParams.MATCH_PARENT
@@ -367,9 +365,9 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
checkAutoFullWithSizeAndAdaptation(gsyVideoPlayer)
}
private fun clearFullscreenLayout(gsyVideoPlayer:ConsultVideoPlayer) {
fun clearFullscreenLayout(gsyVideoPlayer:ConsultVideoPlayer) {
mIfCurrentIsFullscreen = false
val delay = 0
val delay = 100
gsyVideoPlayer.smalllPlayer = null
mInnerHandler.postDelayed({ resolveNormalVideoShow(gsyVideoPlayer) }, delay.toLong())
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View File

@@ -44,7 +44,7 @@ ext {
// json 转换
gson : "com.google.code.gson:gson:2.8.4",
// 内存泄漏检测
debugleakcanary : "com.squareup.leakcanary:leakcanary-android:2.7",
debugleakcanary : "com.squareup.leakcanary:leakcanary-android:2.9.1",
releaseleakcanary : "com.squareup.leakcanary:leakcanary-android-no-op:1.6.3",
testleakcanary : "com.squareup.leakcanary:leakcanary-android-no-op:1.6.3",
//rxJava