2016-12-30 38 views
5

我有一個MediaControllerCompatMediaSession連接建立時創建一個實例。當這個連接完成我創建MediaControllerCompat方式如下:MediaControllerCompat內存泄漏

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

令牌是由MediaSession收購。

檢測到所有按下後退按鈕的時間。我沒有任何回撥/監聽器註冊到MediaControllerCompat。我已經試過在活動的onDestroy()方法中將MediaController設置爲null,但沒有成功。

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內存轉儲文件我可以看到,這確實泄漏每次我旋轉屏幕 - 你有沒有找到一個解決方案。 –

回答

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到託管活動,沒有人已經把它歸零。