概述
沒錯,這是一個bug引發(fā)的思考。其實今天這個標(biāo)題感覺很難取,可能詞窮,也可能語文體育老師教的。不會歸納總結(jié)。現(xiàn)在,開始說正事。
鎮(zhèn)樓的妹子要漂亮
代碼是枯燥的,那么。。。。

image
問題描述
一般Retrofit、OkHttp 大家都會封裝為單例模式。在我司的一個項目中OkHttp中有個文件上傳進度攔截器。攔截器的構(gòu)造函數(shù)里有個文件上傳進度監(jiān)聽器。因為是單例模式,那么很顯然 OkHttp只會初始化一個實例,那同樣的文件進度攔截器也只會初始化一個實例,于是攔截器的實例中也只會有一個文件進度監(jiān)聽器的實例(未提供設(shè)置方法)。而監(jiān)聽器的實例是一個Activity 。 當(dāng)多次傳入不同的 Activity 實例時,其實真正起作用的只有第一次傳入的 Activity 實例。在監(jiān)聽器的回調(diào)函數(shù)中,需要使用到 Activity 中的成員變量。由于此 Activity實例已經(jīng)沒有引用指向它。所以這就導(dǎo)致內(nèi)存泄漏或因為其中的成員變量等為null而導(dǎo)致空指針??傊?,這一種很不好的做法,會導(dǎo)致很多問題。
最佳實踐
- 避免使用 Activity 等的實例作為網(wǎng)絡(luò)請求等耗時操作的監(jiān)聽器。由于網(wǎng)絡(luò)請求耗時等問題,無法釋放從而導(dǎo)致內(nèi)存泄漏
- 由于retrofit、okHttp 等一般使用單例,那么對于他們內(nèi)部使用的監(jiān)聽器最好使用設(shè)置的方式,否則無法及時更新。
總結(jié)
這篇博文雖未涉及到任何代碼,也沒有什么技術(shù)。但個人感覺技術(shù)的思考更為重要。如何更好的利用、使用技術(shù)遠比技術(shù)重要。希望對你有幫助??!