如何在Android studio 中使用單例模式
本篇簡(jiǎn)單介紹如何在Android studio中 使用單例模式和使用注意事項(xiàng)。
單例模式
為什么要使用單例模式?
有一些對(duì)象我們只需要一個(gè),只需要一個(gè)線程池 、緩存或是只有一臺(tái)打印機(jī)、機(jī)器人 、機(jī)器人上面只有一個(gè)尋磁傳感器。我們可以通過(guò)全局的靜態(tài)變量來(lái)實(shí)現(xiàn),但是全局變量在程序一開(kāi)始就創(chuàng)建 可能比較耗費(fèi)資源、可能一直沒(méi)用到。單例模式和全局變量一樣方便又沒(méi)有它的缺點(diǎn)。
單利模式使用
public class Sensor { // 使用靜態(tài)變量記錄唯一的實(shí)例 private static Sensor sensorInstance; /** * 私有的構(gòu)造方法 */ private Sensor(){} /** * 實(shí)例化方法 * @return Sersor * synchronized包住不會(huì)有兩個(gè)線程同時(shí)進(jìn)入 */ public static synchronized Sensor getSersorInstance(){ if(sensorInstance == null) { sensorInstance = new Sensor(); } // 返回Sensor唯一實(shí)例 return sensorInstance; } }
但是如果想要很急切的創(chuàng)建示例,而且在示例創(chuàng)建方面的負(fù)擔(dān)不繁重。
public class Sensor { private static Sensor sensorInstance = new Sensor(); private Sensor(){} public static Sensor getSersorInstance(){ return sensorInstance; } }
如果有很多線程頻繁的使用getSersorInstance可能就影響性能,可以使用雙重檢查加鎖
public class Sensor { // volatile 保證 sensorInstance 被初始化 多個(gè)線程正確的處理 private volatile static Sensor sensorInstance; private Sensor(){} public static Sensor getSersorInstance(){ // 檢查 sensorInstance是否存在 如果不存在就進(jìn)入同步區(qū)塊 if(sensorInstance == null) { // 同步區(qū)塊里面的代碼只有在第一次才會(huì)執(zhí)行 synchronized(Sensor.class) { if(sensorInstance == null) { sensorInstance = new Sensor(); } } } return sensorInstance; } }
Android 中使用內(nèi)存泄漏問(wèn)題
1.在實(shí)例化的時(shí)候我們經(jīng)常需要傳入一些參數(shù) 比如說(shuō) Context
然后順利成章的
Sensor sensor = Sensor.getSersorInstance(MainActivity.this);
然后出現(xiàn)了一個(gè)很?chē)?yán)重的問(wèn)題Sensor單例持有了MainActivity 的this對(duì)象,所以當(dāng)我們轉(zhuǎn)跳其他Activity頁(yè)面的時(shí)候MainActivity 的對(duì)象仍然得不到釋放不能被回收。
所以我們應(yīng)該使用Application中的 context
2.同樣在急切的方法中
public class Sensor { public static final Sensor SENSOR_INSTANCE = new Sensor(); private List<MyListener> mListenerList; private Sensor() { mListenerList = new ArrayList<MyListener>(); } public static Sensor getInstance() { return SENSOR_INSTANCE; } public void registerListener(MyListener listener) { if (!mListenerList.contains(listener)) { mListenerList.add(listener); } } public void unregisterListener(MyListener listener) { mListenerList.remove(listener); } } interface MyListener { public void onSomeThingHappen(); }
MainActivity:
public class MainActivity extends Activity { private MyListener mMyListener=new MyListener() { @Override public void onSomeThingHappen() { } }; private Sensor sensor = Sensor.getInstance(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sensor.registerListener(mMyListener); } }
非靜態(tài)的內(nèi)部類(lèi)(Sensor)的對(duì)象(mListenerList)都是會(huì)持有指向外部類(lèi)對(duì)象(mMyListener)的引用。因此外部類(lèi)對(duì)象(mMyListener)被持有了 同樣的不會(huì)被回收,內(nèi)存泄漏,所以需要
@Override protected void onDestroy() { Sensor.unregisterListener(mMyListener); super.onDestroy(); }
以上就是如何在Android studio 中使用單例模式的詳細(xì)內(nèi)容,更多關(guān)于在Android studio 中使用單例模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Android中單例模式的一些坑小結(jié)
- Android開(kāi)發(fā)中的單例模式應(yīng)用詳解
- Android編程設(shè)計(jì)模式之單例模式實(shí)例詳解
- Android設(shè)計(jì)模式之單例模式解析
- Android設(shè)計(jì)模式之單例模式詳解
- Android單例模式的幾種方法總結(jié)
- Android 單例模式 Singleton 簡(jiǎn)單實(shí)例設(shè)計(jì)模式解析
- android開(kāi)發(fā)設(shè)計(jì)模式之——單例模式詳解
- Android設(shè)計(jì)模式系列之單例模式
- android設(shè)計(jì)模式之單例模式詳解
- Android源碼學(xué)習(xí)之單例模式應(yīng)用及優(yōu)點(diǎn)介紹
- Android 單例模式的四種實(shí)現(xiàn)方式
相關(guān)文章
android實(shí)現(xiàn)多點(diǎn)觸摸應(yīng)用
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)多點(diǎn)觸摸應(yīng)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05android相冊(cè)選擇圖片的編碼實(shí)現(xiàn)代碼
本篇文章主要介紹了android相冊(cè)選擇圖片的編碼實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08Android?實(shí)現(xiàn)單指滑動(dòng)雙指縮放照片demo及過(guò)程解析
這篇文章主要為大家介紹了Android?實(shí)現(xiàn)單指滑動(dòng)雙指縮放照片demo及過(guò)程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Android自定義Drawable實(shí)現(xiàn)圓角效果
這篇文章主要為大家詳細(xì)介紹了Android自定義Drawable實(shí)現(xiàn)圓角效果,實(shí)現(xiàn)一個(gè)圓形和圓角的背景圖片效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Android微信自動(dòng)搶紅包插件優(yōu)化和實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android微信自動(dòng)搶紅包插件優(yōu)化和實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Android應(yīng)用中制作選中后圖標(biāo)變大浮動(dòng)效果的代碼分享
這篇文章主要介紹了Android應(yīng)用中制作選中后圖標(biāo)變大浮動(dòng)效果的代碼分享,這里作者舉了一個(gè)體育賽事app的例子,需要的朋友可以參考下2016-02-02Android 自定義view和屬性動(dòng)畫(huà)實(shí)現(xiàn)充電進(jìn)度條效果
近期項(xiàng)目中需要使用到一種類(lèi)似手機(jī)電池充電進(jìn)度的動(dòng)畫(huà)效果,以前沒(méi)學(xué)屬性動(dòng)畫(huà)的時(shí)候,是用圖片+定時(shí)器的方式來(lái)完成的,下面給大家分享android自定義view和屬性動(dòng)畫(huà)實(shí)現(xiàn)充電進(jìn)度條2016-12-12Android ScrollView取消慣性滾動(dòng)的方法
下面小編就為大家?guī)?lái)一篇Android ScrollView取消慣性滾動(dòng)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04