国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

如何在A(yíng)ndroid studio 中使用單例模式

瀏覽:13日期:2022-09-20 14:52:33

本篇簡(jiǎn)單介紹如何在A(yíng)ndroid studio中 使用單例模式和使用注意事項(xiàng)。

單例模式

為什么要使用單例模式?

有一些對(duì)象我們只需要一個(gè),只需要一個(gè)線(xiàn)程池 、緩存或是只有一臺(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è)線(xiàn)程同時(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; }}

如果有很多線(xiàn)程頻繁的使用getSersorInstance可能就影響性能,可以使用雙重檢查加鎖

public class Sensor { // volatile 保證 sensorInstance 被初始化 多個(gè)線(xiàn)程正確的處理 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(); }

以上就是如何在A(yíng)ndroid studio 中使用單例模式的詳細(xì)內(nèi)容,更多關(guān)于在A(yíng)ndroid studio 中使用單例模式的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 成人满18在线观看网站免费 | 国产女王s调视频vk 国产女王vk | 久久99久久精品久久久久久 | 国产欧美亚洲精品一区 | 玖草 | www.欧美xxxx| 免费一级欧美片片线观看 | 国产一区二区三区四区波多野结衣 | 色片在线播放 | 国产极品喷水视频jk制服 | 久久精品99毛片免费 | 久草久草在线视频 | 国产91精选在线观看网站 | 国产亚洲精品线观看77 | 欧美一级三级在线观看 | 免费黄色欧美 | 91亚洲综合 | 国产一级一片免费播放 | 美女喷水网站 | 国产欧美日韩免费一区二区 | 欧美日韩免费一区二区三区 | 欧美一级毛片特黄大 | 免费毛片视频网站 | 成人小视频在线观看免费 | 国产在线一区二区三区四区 | 欧美精品久久久久久久免费观看 | 国产色啪午夜免费视频 | 国产成人亚洲精品影院 | 国产精品爱久久久久久久小 | 免费国产a国产片高清 | 国产精品一区二区综合 | 欧美高清在线精品一区 | 高清国产一级精品毛片基地 | 亚洲欧美日韩综合一区久久 | 日韩三级免费观看 | 久久香蕉国产观看猫咪3atv | 日本二级毛片免费 | 国产一区二区三区四区波多野结衣 | 成人免费一区二区三区在线观看 | 一区二区三区影院 | 久草视频在线观 |