iT邦幫忙

1

Android Singleton 單例模式應用01

  • 分享至 

  • xImage
  •  

目的:確保一個類別只會產生一個物件

廢話不多說馬上來看Singleton怎麼實作

這個寫法在Android Memory Leak及衍伸問題01有提到
我打算把每個問題都拆開來討論並且個別討論解決方案
避免在一篇文章中提到多個問題而導致讀者混淆解決方案

實作完了馬上就來應用一下比較一下差異

一般狀況
首先在一般沒有使用Singleton的情況,我們任何一個地方使用到物件都必須new一個新的
在這個範例中我們在一個Activity呼叫了3個API,在沒有Singleton的狀態下,就產生了3個不同的物件
https://ithelp.ithome.com.tw/upload/images/20200519/20126774db0NxUBCIp.png

使用Singleton
接下來我們導入Singleton Pattern在同樣的情境下使用,所有地方都是使用同一個物件。在這個範例中我們物件佔用的記憶體空間就是原本的三分之一了
https://ithelp.ithome.com.tw/upload/images/20200519/20126774IbPxRVsvQU.png

一開始講到的目的(確保一個類別只會產生一個物件),可能會有個疑問,只產生一個這件事有這麼重要嗎?
我自己認為,平常很小規模的開發或者記憶體很充足的情況,或許你做不做都感覺不到差異,就如我們剛剛舉的一個例子規模很小,初始化一次根本佔用不了多少時間,當然做不做從一般的使用或者測試下,是沒有辦法察覺的

舉的例子討論一下

我們假設這個物件在初始化的時候需要很高的成本
這邊我在初始化的時候動作加上需要讀取一張3MB的圖片資源檔
https://ithelp.ithome.com.tw/upload/images/20200519/2012677453NyT6txqm.png

一般狀況
可以看到在兩次初始化之間可用記憶體直接少3%了
至於我是怎麼Log記憶體的可以去爬爬文,我是看這個StackOverFlow
https://ithelp.ithome.com.tw/upload/images/20200519/20126774r6j0MLVhjf.png

使用Singleton
在這邊兩次初始化之間記憶體幾乎沒有變動,主要原因就是用Singleton Pattern後,sInstance物件還在,所以根本不需要再重新new一個新物件,當然就不會有多的記憶體被佔用
https://ithelp.ithome.com.tw/upload/images/20200519/20126774sOSlzSn4NW.png

看完這篇其實也是一個結論,從平常就開始養成良好的撰寫習慣,避免Project越養越肥,到時候重構、優化效能做到痛哭流涕

Android Singleton 單例模式應用02(Multi-Thread、Synchronize)


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言