最近項目要上線,檢查了一下手機中關(guān)于項目的各種日志,突然發(fā)現(xiàn)使用WebView的Activity或者Fragment在退出的時候就報出如標(biāo)題上的錯誤,但是我并沒有在項目中使用TextToSpeech這個玩意。
然后參考stackoverflow上的解答http://stackoverflow.com/questions/18038772/leaked-window-exception-even-though-no-service-is-used發(fā)現(xiàn)mWebView.getSettings().setJavaScriptEnabled(true)代碼會使webview中的TextToSpeech這個組件持有Activity的引用,這個組件的生命周期應(yīng)該是比Activity的生命周期要長,所以它持有Activity的引用會造成內(nèi)存泄露,dump一下內(nèi)存發(fā)現(xiàn),如下

發(fā)現(xiàn)這個Activity在我反復(fù)的進出進出居然有10個,而且在我觸發(fā)多次gc內(nèi)存回收之后,這10個Activity的仍然沒有銷毀,按照上述stackoverflow的解決方案,在onDestroy方法中執(zhí)行如下操作

然而并沒有什么卵用,還有一種解決方案就是說在代碼中動態(tài)的生成webview,如下

這個方法起作用,但是改動太大,不可取.
又參考這位仁兄的方法http://blog.csdn.net/shareus/article/details/51742799,如下

發(fā)現(xiàn)logcat中在activity快進快出的時候尼瑪仍然會報上述錯誤.。
按照stackoverflow上的說法,我傳個activity的引用導(dǎo)致內(nèi)存的泄露,那不傳activity的引用,所以有了下面

,然后沒報錯了,嘗試快進快出activity,產(chǎn)生了10個實例,但是gc后這10個activity的實例會被回收,但還是建議在onDestroy方法中加入上面這位仁兄這段代碼

也不知道還有沒有更好的解決方案,有的話告訴小弟一聲。