解决视频播放内存泄漏
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 |
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user