如何在Android studio 中使用單例模式
本篇簡單介紹如何在Android studio中 使用單例模式和使用注意事項(xiàng)。
單例模式
為什么要使用單例模式?
有一些對象我們只需要一個(gè),只需要一個(gè)線程池 、緩存或是只有一臺(tái)打印機(jī)、機(jī)器人 、機(jī)器人上面只有一個(gè)尋磁傳感器。我們可以通過全局的靜態(tài)變量來實(shí)現(xiàn),但是全局變量在程序一開始就創(chuàng)建 可能比較耗費(fè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)存泄漏問題
1.在實(shí)例化的時(shí)候我們經(jīng)常需要傳入一些參數(shù) 比如說 Context
然后順利成章的
Sensor sensor = Sensor.getSersorInstance(MainActivity.this);
然后出現(xiàn)了一個(gè)很嚴(yán)重的問題Sensor單例持有了MainActivity 的this對象,所以當(dāng)我們轉(zhuǎn)跳其他Activity頁面的時(shí)候MainActivity 的對象仍然得不到釋放不能被回收。
所以我們應(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)部類(Sensor)的對象(mListenerList)都是會(huì)持有指向外部類對象(mMyListener)的引用。因此外部類對象(mMyListener)被持有了 同樣的不會(huì)被回收,內(nèi)存泄漏,所以需要
@Override
protected void onDestroy() {
Sensor.unregisterListener(mMyListener);
super.onDestroy();
}
以上就是如何在Android studio 中使用單例模式的詳細(xì)內(nèi)容,更多關(guān)于在Android studio 中使用單例模式的資料請關(guān)注腳本之家其它相關(guān)文章!
- Android中單例模式的一些坑小結(jié)
- Android開發(fā)中的單例模式應(yīng)用詳解
- Android編程設(shè)計(jì)模式之單例模式實(shí)例詳解
- Android設(shè)計(jì)模式之單例模式解析
- Android設(shè)計(jì)模式之單例模式詳解
- Android單例模式的幾種方法總結(jié)
- Android 單例模式 Singleton 簡單實(shí)例設(shè)計(jì)模式解析
- android開發(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)鍵盤彈出界面上移的實(shí)現(xiàn)思路
這篇文章主要介紹了Android實(shí)現(xiàn)鍵盤彈出界面上移的實(shí)現(xiàn)思路,需要的朋友可以參考下2018-04-04
實(shí)例講解Android App使用自帶的SQLite數(shù)據(jù)庫的基本方法
這篇文章主要介紹了Android App使用自帶的SQLite數(shù)據(jù)庫的基本方法,SQLite是一個(gè)小巧的內(nèi)嵌型數(shù)據(jù)庫,在數(shù)據(jù)庫需求不大的情況下使用SQLite其實(shí)非常有效,需要的朋友可以參考下2016-04-04
Android Flutter利用貝塞爾曲線畫一個(gè)小海豚
貝塞爾曲線的應(yīng)用填補(bǔ)了計(jì)算機(jī)繪制與手繪之前的差距,更能表達(dá)人想畫出的曲線。本文就將利用貝塞爾曲線繪制一個(gè)可愛的小海豚,需要的可以參考一下2022-04-04
Android中LeakCanary檢測內(nèi)存泄漏的方法
本篇文章主要介紹了Android中LeakCanary檢測內(nèi)存泄漏的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
Android 超詳細(xì)講解fitsSystemWindows屬性的使用
fitsSystemWindows屬性可以讓view根據(jù)系統(tǒng)窗口來調(diào)整自己的布局;簡單點(diǎn)說就是我們在設(shè)置應(yīng)用布局時(shí)是否考慮系統(tǒng)窗口布局,這里系統(tǒng)窗口包括系統(tǒng)狀態(tài)欄、導(dǎo)航欄、輸入法等,包括一些手機(jī)系統(tǒng)帶有的底部虛擬按鍵2022-03-03
Android和IOS的瀏覽器中檢測是否安裝某個(gè)客戶端的方法
這篇文章主要介紹了Android和IOS的瀏覽器中檢測是否安裝某個(gè)客戶端的方法,需要的朋友可以參考下2014-06-06
android中Fragment+RadioButton實(shí)現(xiàn)底部導(dǎo)航欄
本篇文章主要介紹了android中Fragment+RadioButton實(shí)現(xiàn)底部導(dǎo)航欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
Flutter實(shí)現(xiàn)自定義篩選框的示例代碼
本文主要介紹了Flutter實(shí)現(xiàn)自定義篩選框的示例代碼,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07

