5

У меня есть MediaControllerCompat, который создается экземпляром при установлении соединения MediaSession. Когда эта связь осуществляется Создаю MediaControllerCompat следующим образом:Ошибка памяти MediaControllerCompat

MediaControllerCompat mediaController = new MediaControllerCompat(this, token); 
MediaControllerCompat.setMediaController(this, mediaController); 

Маркер является приобретение из MediaSession.

Все время, когда эта кнопка назад нажата, обнаружена утечка. У меня нет обратного вызова/слушателя, зарегистрированного на MediaControllerCompat. Я уже пробовал установить MediaController на нуль в действии onDestroy(), без успеха.

MediaControllerCompat.setMediaController(this, null); 

Следуйте за рекордом LeakCanary.

D/LeakCanary: * com.me.PlaybackFullscreenActivity has leaked: 
D/LeakCanary: * GC ROOT android.os.ResultReceiver$MyResultReceiver.this$0 
D/LeakCanary: * references android.support.v4.media.session.MediaControllerCompat$MediaControllerImplApi21$1.this$0 (anonymous subclass of android.os.ResultReceiver) 
D/LeakCanary: * references android.support.v4.media.session.MediaControllerCompat$MediaControllerImplApi23.mControllerObj 
D/LeakCanary: * references android.media.session.MediaController.mContext 
D/LeakCanary: * leaks com.me.ui.playback.PlaybackFullscreenActivity instance 
D/LeakCanary: * Retaining: 54 KB. 
D/LeakCanary: * Reference Key: 004ed9cd-c668-4d23-9ee6-cecad1b980a5 
D/LeakCanary: * Device: unknown Android Android SDK built for x86_64 sdk_google_phone_x86_64 
D/LeakCanary: * Android Version: 7.1 API: 25 LeakCanary: 1.5 00f37f5 
D/LeakCanary: * Durations: watch=5018ms, gc=115ms, heap dump=1936ms, analysis=6011ms 
D/LeakCanary: * Details: 
D/LeakCanary: * Instance of android.os.ResultReceiver$MyResultReceiver 
D/LeakCanary: | this$0 = android.support.v4[email protected]322318080 (0x13362f00) 
D/LeakCanary: | mDescriptor = [email protected] (0x707ae1d0) 
D/LeakCanary: | mObject = -813433536 
D/LeakCanary: | mOwner = [email protected] (0x13362f60) 
D/LeakCanary: | shadow$_klass_ = android.os.ResultReceiver$MyResultReceiver 
D/LeakCanary: | shadow$_monitor_ = 0 
D/LeakCanary: * Instance of android.support.v4.media.session.MediaControllerCompat$MediaControllerImplApi21$1 
D/LeakCanary: | this$0 = android.support.[email protected]322317952 (0x13362e80) 
D/LeakCanary: | mHandler = [email protected] (0x13362f40) 
D/LeakCanary: | mLocal = true 
D/LeakCanary: | mReceiver = [email protected] (0x13362f60) 
D/LeakCanary: | shadow$_klass_ = android.support.v4.media.session.MediaControllerCompat$MediaControllerImplApi21$1 
D/LeakCanary: | shadow$_monitor_ = 0 
D/LeakCanary: * Instance of android.support.v4.media.session.MediaControllerCompat$MediaControllerImplApi23 
D/LeakCanary: | mCallbackMap = [email protected] (0x133a49a0) 
D/LeakCanary: | mControllerObj = [email protected] (0x133a49d0) 
D/LeakCanary: | mExtraBinder = android.support.v4.medi[email protected]319823424 (0x13101e40) 
D/LeakCanary: | mPendingCallbacks = null 
D/LeakCanary: | shadow$_klass_ = android.support.v4.media.session.MediaControllerCompat$MediaControllerImplApi23 
D/LeakCanary: | shadow$_monitor_ = 0 
D/LeakCanary: * Instance of android.media.session.MediaController 
D/LeakCanary: | static MSG_UPDATE_EXTRAS = 7 
D/LeakCanary: | static MSG_DESTROYED = 8 
D/LeakCanary: | static MSG_UPDATE_VOLUME = 4 
D/LeakCanary: | static MSG_UPDATE_QUEUE_TITLE = 6 
D/LeakCanary: | static MSG_UPDATE_PLAYBACK_STATE = 2 
D/LeakCanary: | static $staticOverhead = byte[72]@317243393 (0x12e8c001) 
D/LeakCanary: | static MSG_UPDATE_QUEUE = 5 
D/LeakCanary: | static MSG_EVENT = 1 
D/LeakCanary: | static TAG = [email protected] (0x706e8958) 
D/LeakCanary: | static MSG_UPDATE_METADATA = 3 
D/LeakCanary: | mCallbacks = [email protected] (0x13362ee0) 
D/LeakCanary: | mCbRegistered = false 
D/LeakCanary: | mCbStub = [email protected] (0x13362ea0) 
D/LeakCanary: | mContext = [email protected] (0x133e1c00) 
D/LeakCanary: | mLock = [email protected] (0x130b06c0) 
D/LeakCanary: | mPackageName = null 
D/LeakCanary: | mSessionBinder = [email protected] (0x130b0e90) 
D/LeakCanary: | mTag = null 
D/LeakCanary: | mToken = [email protected] (0x130b06e0) 
D/LeakCanary: | mTransportControls = [email protected]4 (0x130b06d0) 
D/LeakCanary: | shadow$_klass_ = android.media.session.MediaController 
D/LeakCanary: | shadow$_monitor_ = 0 
D/LeakCanary: * Instance of com.me.ui.playback.PlaybackFullscreenActivity 
D/LeakCanary: | static $staticOverhead = byte[16]@317706241 (0x12efd001) 
D/LeakCanary: | static serialVersionUID = 0 
D/LeakCanary: | static $change = null 
D/LeakCanary: | mToolbar = [email protected] (0x13238400) 
D/LeakCanary: | playbackFragment = [email protected] (0x12fc4ab0) 
D/LeakCanary: | mDelegate = [email protected] (0x13139b20) 
D/LeakCanary: | mEatKeyUpEvent = false 
D/LeakCanary: | mResources = null 
D/LeakCanary: | mThemeId = 2131427393 
D/LeakCanary: | mCreated = true 
D/LeakCanary: | mFragments = [email protected] (0x134be460) 
D/LeakCanary: | mHandler = [email protected] (0x134d6520) 
D/LeakCanary: | mNextCandidateRequestIndex = 0 
D/LeakCanary: | mOptionsMenuInvalidated = false 
D/LeakCanary: | mPendingFragmentActivityResults = [email protected] (0x134d68a0) 
D/LeakCanary: | mReallyStopped = true 
D/LeakCanary: | mRequestedPermissionsFromFragment = false 
D/LeakCanary: | mResumed = false 
D/LeakCanary: | mRetaining = false 
D/LeakCanary: | mStopped = true 
D/LeakCanary: | mStartedActivityFromFragment = false 
D/LeakCanary: | mStartedIntentSenderFromFragment = false 
D/LeakCanary: | mExtraDataMap = [email protected] (0x134d6500) 
D/LeakCanary: | mActionBar = null 
D/LeakCanary: | mActionModeTypeStarting = 0 
D/LeakCanary: | mActivityInfo = [email protected] (0x130fe080) 
D/LeakCanary: | mActivityTransitionState = [email protected] (0x134cb940) 
D/LeakCanary: | mApplication = [email protected] (0x12c4f910) 
D/LeakCanary: | mCalled = true 
D/LeakCanary: | mChangeCanvasToTranslucent = false 
D/LeakCanary: | mChangingConfigurations = false 
D/LeakCanary: | mComponent = [email protected] (0x134d3070) 
D/LeakCanary: | mConfigChangeFlags = 0 
D/LeakCanary: | mCurrentConfig = [email protected] (0x134da460) 
D/LeakCanary: | mDecor = null 
D/LeakCanary: | mDefaultKeyMode = 0 
D/LeakCanary: | mDefaultKeySsb = null 
D/LeakCanary: | mDestroyed = true 
D/LeakCanary: | mDoReportFullyDrawn = false 
D/LeakCanary: | mEmbeddedID = null 
D/LeakCanary: | mEnableDefaultActionBarUp = false 
D/LeakCanary: | mEnterTransitionListener = [email protected] (0x708e5728) 
D/LeakCanary: | mExitTransitionListener = [email protected] (0x708e5728) 
D/LeakCanary: | mFinished = true 
D/LeakCanary: | mFragments = [email protected] (0x134be430) 
D/LeakCanary: | mHandler = [email protected] (0x134d64a0) 
D/LeakCanary: | mIdent = 169286722 
D/LeakCanary: | mInstanceTracker = [email protected] (0x134be440) 
D/LeakCanary: | mInstrumentation = [email protected] (0x12c733d0) 
D/LeakCanary: | mIntent = [email protected] (0x134d2040) 
D/LeakCanary: | mLastNonConfigurationInstances = null 
D/LeakCanary: | mMainThread = [email protected] (0x12c357c0) 
D/LeakCanary: | mManagedCursors = [email protected] (0x134d64c0) 
D/LeakCanary: | mManagedDialogs = null 
D/LeakCanary: | mMenuInflater = null 
D/LeakCanary: | mParent = null 
D/LeakCanary: | mReferrer = [email protected] (0x134d2280) 
D/LeakCanary: | mResultCode = 0 
D/LeakCanary: | mResultData = null 
D/LeakCanary: | mResumed = false 
D/LeakCanary: | mSearchEvent = null 
D/LeakCanary: | mSearchManager = null 
D/LeakCanary: | mStartedActivity = false 
D/LeakCanary: | mStopped = true 
D/LeakCanary: | mTemporaryPause = false 
D/LeakCanary: | mTitle = [email protected] (0x12c1d0c0) 
D/LeakCanary: | mTitleColor = 0 
D/LeakCanary: | mTitleReady = true 
D/LeakCanary: | mToken = [email protected] (0x134d4040) 
D/LeakCanary: | mTranslucentCallback = null 
D/LeakCanary: | mUiThread = [email protected] (0x74929258) 
D/LeakCanary: | mVisibleBehind = false 
D/LeakCanary: | mVisibleFromClient = true 
D/LeakCanary: | mVisibleFromServer = true 
D/LeakCanary: | mVoiceInteractor = null 
D/LeakCanary: | mWindow = [email protected] (0x12ef0860) 
D/LeakCanary: | mWindowAdded = true 
D/LeakCanary: | mWindowManager = [email protected] (0x134d66c0) 
D/LeakCanary: | mInflater = [email protected] (0x134c6fa0) 
D/LeakCanary: | mOverrideConfiguration = null 
D/LeakCanary: | mResources = [email protected] (0x12c73380) 
D/LeakCanary: | mTheme = [email protected] (0x134d66e0) 
D/LeakCanary: | mThemeResource = 2131427393 
D/LeakCanary: | mBase = [email protected] (0x130fb500) 
D/LeakCanary: | shadow$_klass_ = com.me.ui.playback.PlaybackFullscreenActivity 
D/LeakCanary: | shadow$_monitor_ = 1293121552 
D/LeakCanary: * Excluded Refs: 
D/LeakCanary: | Field: android.view.inputmethod.InputMethodManager.mNextServedView 
D/LeakCanary: | Field: android.view.inputmethod.InputMethodManager.mServedView 
D/LeakCanary: | Field: android.view.inputmethod.InputMethodManager.mServedInputConnection 
D/LeakCanary: | Field: android.view.inputmethod.InputMethodManager.mCurRootView 
D/LeakCanary: | Field: android.os.UserManager.mContext 
D/LeakCanary: | Field: android.net.ConnectivityManager.sInstance 
D/LeakCanary: | Field: android.view.Choreographer$FrameDisplayEventReceiver.mMessageQueue (always) 
D/LeakCanary: | Thread:FinalizerWatchdogDaemon (always) 
D/LeakCanary: | Thread:main (always) 
D/LeakCanary: | Thread:LeakCanary-Heap-Dump (always) 
D/LeakCanary: | Class:java.lang.ref.WeakReference (always) 
D/LeakCanary: | Class:java.lang.ref.SoftReference (always) 
D/LeakCanary: | Class:java.lang.ref.PhantomReference (always) 
D/LeakCanary: | Class:java.lang.ref.Finalizer (always) 
D/LeakCanary: | Class:java.lang.ref.FinalizerReference (always) 

Может кто-нибудь мне помочь?

Заранее спасибо.

+0

У меня такая же проблема - расследование моего файла дампа памяти hprof. Я вижу, что это действительно происходит при каждом повороте экрана - вы когда-либо находили решение. –

ответ

5

Эта утечка была исправлена ​​и выпущена в библиотеке поддержки 25.2.0. Шрифт: issuetracker

2

MediaControllerCompat.setMediaController()instantiatescontrollerObj. Затем этот объект is used to performsetMediaController(activity, controllerObj). После этого я не вижу швов, которые могли бы просочиться. controllerObjне. Другими словами, кажется, что нужно заботиться о обнуления из этого объекта на его собственное:

MediaSessionCompat mediaSessionCompat = ...; 

MediaController mediaController = 
    (MediaController) mediaSessionCompat.getController().getMediaController(); 

// explicitly nulling out MediaController 
mediaController = null; 

Обратите внимание, что выполнение MediaControllerCompat.setMediaController(this, null) не будет делать ранее заданный объект, который будет обнулен, скорее это просто update текущий экземпляр с новым. Но controllerObjkeeps a hard reference к хостинговой деятельности, и никто не позаботился об аннулировании.

Смежные вопросы