欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何在Android studio 中使用單例模式

 更新時間:2021年03月17日 14:58:15   作者:可愛的黑精靈  
這篇文章主要介紹了如何在Android studio 中使用單例模式,幫助大家更好的理解和學(xué)習(xí)Android開發(fā),感興趣的朋友可以了解下

本篇簡單介紹如何在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)建方面的負(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 被初始化 多個線程正確的處理
  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)了一個很嚴(yán)重的問題Sensor單例持有了MainActivity 的this對象,所以當(dāng)我們轉(zhuǎn)跳其他Activity頁面的時候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)都是會持有指向外部類對象(mMyListener)的引用。因此外部類對象(mMyListener)被持有了 同樣的不會被回收,內(nèi)存泄漏,所以需要

@Override
  protected void onDestroy() {
    Sensor.unregisterListener(mMyListener);
    super.onDestroy();
  }

以上就是如何在Android studio 中使用單例模式的詳細(xì)內(nèi)容,更多關(guān)于在Android studio 中使用單例模式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • android實現(xiàn)多點觸摸應(yīng)用

    android實現(xiàn)多點觸摸應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了android實現(xiàn)多點觸摸應(yīng)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • android相冊選擇圖片的編碼實現(xiàn)代碼

    android相冊選擇圖片的編碼實現(xiàn)代碼

    本篇文章主要介紹了android相冊選擇圖片的編碼實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Android?實現(xiàn)單指滑動雙指縮放照片demo及過程解析

    Android?實現(xiàn)單指滑動雙指縮放照片demo及過程解析

    這篇文章主要為大家介紹了Android?實現(xiàn)單指滑動雙指縮放照片demo及過程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Android自定義Drawable實現(xiàn)圓角效果

    Android自定義Drawable實現(xiàn)圓角效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義Drawable實現(xiàn)圓角效果,實現(xiàn)一個圓形和圓角的背景圖片效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • flutter?text組件使用示例詳解

    flutter?text組件使用示例詳解

    這篇文章主要為大家介紹了flutter?text組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Android微信自動搶紅包插件優(yōu)化和實現(xiàn)

    Android微信自動搶紅包插件優(yōu)化和實現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Android微信自動搶紅包插件優(yōu)化和實現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android應(yīng)用中制作選中后圖標(biāo)變大浮動效果的代碼分享

    Android應(yīng)用中制作選中后圖標(biāo)變大浮動效果的代碼分享

    這篇文章主要介紹了Android應(yīng)用中制作選中后圖標(biāo)變大浮動效果的代碼分享,這里作者舉了一個體育賽事app的例子,需要的朋友可以參考下
    2016-02-02
  • Android實現(xiàn)拍照截圖功能

    Android實現(xiàn)拍照截圖功能

    這篇文章主要介紹了Android實現(xiàn)拍照截圖功能,簡單介紹了Android實現(xiàn)拍照截圖功能的步驟,供大家參考,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Android 自定義view和屬性動畫實現(xiàn)充電進度條效果

    Android 自定義view和屬性動畫實現(xiàn)充電進度條效果

    近期項目中需要使用到一種類似手機電池充電進度的動畫效果,以前沒學(xué)屬性動畫的時候,是用圖片+定時器的方式來完成的,下面給大家分享android自定義view和屬性動畫實現(xiàn)充電進度條
    2016-12-12
  • Android ScrollView取消慣性滾動的方法

    Android ScrollView取消慣性滾動的方法

    下面小編就為大家?guī)硪黄狝ndroid ScrollView取消慣性滾動的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04

最新評論