這篇文章主要介紹了怎么在Android studio中使用單例模式,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
為什么要使用單例模式?
有一些對象我們只需要一個,只需要一個線程池 、緩存或是只有一臺打印機、機器人 、機器人上面只有一個尋磁傳感器。我們可以通過全局的靜態變量來實現,但是全局變量在程序一開始就創建 可能比較耗費資源、可能一直沒用到。單例模式和全局變量一樣方便又沒有它的缺點。
public class Sensor { // 使用靜態變量記錄唯一的實例 private static Sensor sensorInstance; /** * 私有的構造方法 */ private Sensor(){} /** * 實例化方法 * @return Sersor * synchronized包住不會有兩個線程同時進入 */ public static synchronized Sensor getSersorInstance(){ if(sensorInstance == null) { sensorInstance = new Sensor(); } // 返回Sensor唯一實例 return sensorInstance; } }
但是如果想要很急切的創建示例,而且在示例創建方面的負擔不繁重。
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是否存在 如果不存在就進入同步區塊 if(sensorInstance == null) { // 同步區塊里面的代碼只有在第一次才會執行 synchronized(Sensor.class) { if(sensorInstance == null) { sensorInstance = new Sensor(); } } } return sensorInstance; } }
1.在實例化的時候我們經常需要傳入一些參數 比如說 Context
然后順利成章的
Sensor sensor = Sensor.getSersorInstance(MainActivity.this);
然后出現了一個很嚴重的問題Sensor單例持有了MainActivity 的this對象,所以當我們轉跳其他Activity頁面的時候MainActivity 的對象仍然得不到釋放不能被回收。
所以我們應該使用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); } }
非靜態的內部類(Sensor)的對象(mListenerList)都是會持有指向外部類對象(mMyListener)的引用。因此外部類對象(mMyListener)被持有了 同樣的不會被回收,內存泄漏,所以需要
@Override protected void onDestroy() { Sensor.unregisterListener(mMyListener); super.onDestroy(); }
感謝你能夠認真閱讀完這篇文章,希望小編分享的“怎么在Android studio中使用單例模式”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。