bug日記-單例模式下的監(jiān)聽器應(yīng)該怎么設(shè)置?

概述

沒錯,這是一個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ù)重要。希望對你有幫助??!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容