2012-10-01 83 views
2

IntentReceiver正在泄露由於onDetachedFromWindow 不會被調用在某些情況下的Android - IntentReceiver泄漏/漏水/泄露

@Override 
protected void onDetachedFromWindow() { 
 super.onDetachedFromWindow(); 
 mContext.unregisterReceiver(mScreenStateReceiver); 
} 

這是發現與大量的測試設備和Android版本到Android 4.1.1。我使用老版本以及最新的Eclipse 4.2.1進行編譯,其中各種SDK Tool版本高達20.0.3。

logcat的可以在這裏找到: https://developers.google.com/mobile-ads-sdk/community/discussion?place=msg%2Fgoogle-admob-ads-sdk%2FVYSun9iD8tg%2FL3t6oSlrCbYJ

Activity myActivity has leaked IntentReceiver com.adsdk.sdk.banner.AdView that 
was originally registered here. Are you missing a call to unregisterReceiver()? 

接縫,這是一個已知的錯誤http://code.google.com/p/android/issues/detail?id=29399

有沒有解決辦法?非常感謝您解決這一挑戰!

基督教

+0

其更好地註銷從的onStop接收機(),做到: 如果(isFinishing()){ mContext.unregisterReceiver(mScreenStateReceiver); } –

+0

非常感謝您的提示!我在自定義視圖中使用onDetachedFromWindow作爲庫的一部分。所以我不能直接使用onStop,而寧願圖書館的用戶不必處理這個問題,我在onStop期間給我的圖書館打了一個額外的電話。 – Mobiledata

+0

我會建議創建一個公共方法,用戶調用以阻止自定義視圖上的接收器。如果您使用CustomView廣告,我想你有一個啓動方法,那麼爲什麼不添加一個方法來停止。我知道隱式釋放資源會更好,但我認爲添加另一個方法調用比泄漏更好。只需在您的文檔中明確。 –

回答

0

我建議不要依靠 'onAttachedToWindow' & 'onDetachedFromWindow'。您可以添加像'init'&'destroy'這樣的配對操作來完成像'register'&'unregister'BroadcastReceiver這樣的工作。然後你可以完全控制,以避免這種類型的泄漏。或者,你可以明確地調用onDetachedFromWindow。