日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android studio列模式,在Android studio 中使用单例模式

發(fā)布時間:2025/3/12 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android studio列模式,在Android studio 中使用单例模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本篇簡單介紹如何在Android studio中 使用單例模式和使用注意事項。

單例模式

為什么要使用單例模式?

有一些對象我們只需要一個,只需要一個線程池 、緩存或是只有一臺打印機、機器人 、機器人上面只有一個尋磁傳感器。我們可以通過全局的靜態(tài)變量來實現(xiàn),但是全局變量在程序一開始就創(chuàng)建 可能比較耗費資源、可能一直沒用到。單例模式和全局變量一樣方便又沒有它的缺點。

單利模式使用

public class Sensor {

// 使用靜態(tài)變量記錄唯一的實例

private static Sensor sensorInstance;

/**

* 私有的構(gòu)造方法

*/

private Sensor(){}

/**

* 實例化方法

* @return Sersor

* synchronized包住不會有兩個線程同時進入

*/

public static synchronized Sensor getSersorInstance(){

if(sensorInstance == null) {

sensorInstance = new Sensor();

}

// 返回Sensor唯一實例

return sensorInstance;

}

}

但是如果想要很急切的創(chuàng)建示例,而且在示例創(chuàng)建方面的負擔不繁重。

public class Sensor {

private static Sensor sensorInstance = new Sensor();

private Sensor(){}

public static Sensor getSersorInstance(){

return sensorInstance;

}

}

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

public class Sensor {

// volatile 保證 sensorInstance 被初始化 多個線程正確的處理

private volatile static Sensor sensorInstance;

private Sensor(){}

public static Sensor getSersorInstance(){

// 檢查 sensorInstance是否存在 如果不存在就進入同步區(qū)塊

if(sensorInstance == null) {

// 同步區(qū)塊里面的代碼只有在第一次才會執(zhí)行

synchronized(Sensor.class) {

if(sensorInstance == null) {

sensorInstance = new Sensor();

}

}

}

return sensorInstance;

}

}

Android 中使用內(nèi)存泄漏問題

1.在實例化的時候我們經(jīng)常需要傳入一些參數(shù) 比如說 Context

然后順利成章的

Sensor sensor = Sensor.getSersorInstance(MainActivity.this);

然后出現(xiàn)了一個很嚴重的問題Sensor單例持有了MainActivity 的this對象,所以當我們轉(zhuǎn)跳其他Activity頁面的時候MainActivity 的對象仍然得不到釋放不能被回收。

所以我們應(yīng)該使用Application中的 context

2.同樣在急切的方法中

public class Sensor {

public static final Sensor SENSOR_INSTANCE = new Sensor();

private List mListenerList;

private Sensor() {

mListenerList = new ArrayList();

}

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)部類(Sensor)的對象(mListenerList)都是會持有指向外部類對象(mMyListener)的引用。因此外部類對象(mMyListener)被持有了 同樣的不會被回收,內(nèi)存泄漏,所以需要

@Override

protected void onDestroy() {

Sensor.unregisterListener(mMyListener);

super.onDestroy();

}

總結(jié)

以上是生活随笔為你收集整理的android studio列模式,在Android studio 中使用单例模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。