當前位置:首頁 » 安卓系統 » android單例模式

android單例模式

發布時間: 2022-02-14 20:58:08

A. android中什麼是單例模式

單例模式(Singleton)
一、 什麼是單例模式
單例模式,簡單點來說就是設計一個類,使其在任何時候,最多隻有一個實例,並提供一個訪問這個實例的全局訪問點。

二、 為什麼要單例
在程序中的很多地方,只有一個實例是非常重要的。例如,在windows中,任務管理器只有一個,無論你點擊多少次打開任務管理器,任務管理器也只會生成一個窗口。再例如,在一些軟體中,工具箱是唯一的,無論你點擊多少次打開工具箱,工具箱也只一個。

為什麼要這樣設計呢?因為像任務管理器或工具箱這樣的程序,只要有一個就足夠完成所有的工作了,多個程序只會白白消耗系統資源,而像任務管理器這類的程序還會引入多個任務管理器之間的同步問題,所以對些這些程序來說,只有一個實例或程序是必要的。

三、 為什麼需要單例模式
上面講到對於某些程序來說,保持其只有一個實例是必要的,但是如何保證一個程序或一個類只有一個實例呢?下面從類的角度來解說。

B. android之單例模式:懶漢式和餓漢式的區別

比較:
餓漢式是線程安全的,在類創建的同時就已經創建好一個靜態的對象供系統使用,以後不在改變。
懶漢式如果在創建實例對象時不加上synchronized則會導致對對象的訪問不是線程安全的。

C. Android之什麼場景該使用單例模式總結

我來補充下樓上: 進程關閉的時機是: 1.用Process.kill或者shell去殺死進程 2.系統通過memory策略來殺死後台進程。 說說第二種吧,當程序按Home鍵或者Back鍵退出後就變做後台進程。 另外,當程序啟動了新的進程。而新的進程進入前台模式,此時程序也變成後台進程。 當前台進程退出,後台進程按照堆棧結構再次呈現時。很可能是個重啟進程的過程,重啟進程意味著單例對象也重新初始化了。這點要尤其謹慎

D. Android中單例模式和靜態方法在效率上哪個好

很多人包括我寫單例的時候,第一想到的就是懶漢式publicclassSingleton{;privateSingleton(){}(){if(instance==null){instance=newSingleton();}returninstance;}}代碼很簡單,而且是懶載入,只有調用getInstance方法是才會初始化。但是這樣是線程不安全的,即當多個線程並行調用getInstance的時候,就會創建多個實例,不能正常工作。所以這里就有了加鎖方式,將整個getInstance方法設為同步,添加synchronized關鍵字。publicclassSingleton{;privateSingleton(){}(){if(instance==null){instance=newSingleton();}returninstance;}}這樣簡單粗暴的方式,雖然做到了線程安全,但導致了同一時間內只能有一個線程能夠調用getInstance方法。其實我們僅僅需要對初始化的代碼進行同步,這就有了雙重檢驗鎖方式。publicclassSingleton{;privateSingleton(){}(){if(instance==null){//第一次檢查synchronized(Singleton.class){if(instance==null){//第二次檢查instance=newSingleton();}}}returninstance;}}這里第二次檢查,是因為如果有多個線程同時執行完了第一次檢查,這時如果同步塊內不進行第二次檢查的話,會生成多個實例了。但是看了相關資料後,發現這樣還是有點問題。引用資料中的介紹:由於instance=newSingleton(),這並非是一個原子操作,事實上在JVM中這句話大概做了下面3件事情。1.給instance分配內存2.調用Singleton的構造函數來初始化成員變數3.將instance對象指向分配的內存空間(執行完這步instance就為非null了)但是在JVM的即時編譯器中存在指令重排序的優化。也就是說上面的第二步和第三步的順序是不能保證的,最終的執行順序可能是1-2-3也可能是1-3-2。如果是後者,則在3執行完畢、2未執行之前,被線程二搶佔了,這時instance已經是非null了(但卻沒有初始化),所以線程二會直接返回instance,然後使用,然後順理成章地報錯。我們只需要將instance變數聲明成volatile就可以了。

E. android 幾種單例模式的寫法

先不論單例模式的寫法,有些方面是相同的,比如都需要將唯一的對象設置為static的,都需要將構造方法private化,代碼如下:
public class MyInstance { private static MyInstance instance; private MyInstance(){}
}
第一種:最原始的單例模式,代碼如下:
public static MyInstance getInstance(){ if(instance==null){ instance=new MyInstance();
} return instance;
}
多線程並發時,可能會出現重復new對象的情況,因此不提倡使用。
第二種:將整個方法塊進行加鎖,保證線程安全。
public static synchronized MyInstance getInstance(){ if(instance==null){ instance=new MyInstance();
} return instance;
}

這種代碼下,每條線程都會依次進入方法塊內部,雖然實現了單例,但是影響了運行效率,可以使用但是也不怎麼提倡。
第三種:進一步優化的方法。
public static MyInstance getsInstance(){ synchronized (MyInstance.class){ if(instance==null){ instance=new MyInstance(); return instance;
}else{ return instance;
}
}
}

這種方式只是第二種方法的一種優化,但是優化有限。
(以下的幾種方法比較推薦使用)
第四種:雙層判斷加鎖,效率影響小且保證了線程安全。
public static MyInstance getsInstance() { if (instance == null) { synchronized (MyInstance.class) { if(instance==null){ instance=new MyInstance();
}
}
} return instance;
}

這種方法是對第二種和第三種方法的進一步優化,比較推薦使用。
第五種:內部類實現單例,不用線程鎖來實現效率的提升。
public class MyInstance { private MyInstance() {
} public static MyInstance getInstance(){ return MyInstanceHolder.instance;
} private static class MyInstanceHolder{ private static MyInstance instance=new MyInstance();
}
}

在內部類中new對象,再將內部類的對象返回,這種方法是使用了java中class載入時互斥的原理來實現了線程的安全。不加線程鎖也使得運行效率不會受到較大的影響。比較提倡。

F. 結合Android 看看單例模式怎麼寫

java模式之單例模式: 單例模式確保一個類只有一個實例,自行提供這個實例並向整個系統提供這個實例。 特點: 1,一個類只能有一個實例 2,自己創建這個實例 3,整個系統都要使用這個實例 Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。在很多操作中,比如建立目錄 資料庫連接都需要這樣的單線程操作。一些資源管理器常常設計成單例模式。 外部資源:譬如每台計算機可以有若干個列印機,但只能有一個Printer Spooler,以避免兩個列印作業同時輸出到列印機中。每台計算機可以有若干個通信埠,系統應當集中管理這些通信埠,以避免一個通信埠被兩個請求同時調用。內部資源,譬如,大多數的軟體都有一個(甚至多個)屬性文件存放系統配置。這樣的系統應當由一個對象來管理這些屬性文件。 一個例子:Windows 回收站。 在整個視窗系統中,回收站只能有一個實例,整個系統都使用這個惟一的實例,而且回收站自行提供自己的實例。因此,回收站是單例模式的應用。 兩種形式: 1,餓漢式單例類 public class Singleton { private Singleton(){} //在自己內部定義自己一個實例,是不是很奇怪? //注意這是private 只供內部調用 private static Singleton instance = new Singleton(); //這里提供了一個供外部訪問本class的靜態方法,可以直接訪問 public static Singleton getInstance() { return instance; } } 2,懶漢式單例類 public class Singleton { private static Singleton instance = null; public static synchronized Singleton getInstance() { //這個方法比上面有所改進,不用每次都進行生成對象,只是第一次 //使用時生成實例,提高了效率! if (instance==null) instance=new Singleton(); return instance; } } 第二中形式是lazy initialization,也就是說第一次調用時初始Singleton,以後就不用再生成了。 注意到lazy initialization形式中的synchronized,這個synchronized很重要,如果沒有synchronized,那麼使用getInstance()是有可能得到多個Singleton實例。 一般來說第一種比較安全 我自己比較常用的方式: public class Singleton { private volatile static Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(singleton==null){ synchronized(Singleton.class){ if(singleton==null){ singleton=new Singleton(); } } } return singleton; } }

G. 如何完全退出單例模式下的android應用程序,非常好用

首先問題是這樣的,比如:我剛進入應用時有一個歡迎頁面(E),隨後進入主A,我從A->B->C->D,然後直接從D返回到A,在A中完全退出應用。對於android自帶的1.5 - 2.1以及2.2之後完全退出應用的API我都試了,但還是實現不了,有的是能退出,但是歡迎頁面就沒有了,可能是我的原因。 後來我是這樣實現的,當然有點老土,但還是能實現的。如下,同樣也歡迎拍磚

public class ExitApplication extends Application {
//存儲已打開的Activity集合
private List<Activity> list = new ArrayList<Activity>();

//單例的ExitApplication,目的是在任何的Activity中用的都是同一個集合
private static ExitApplication ea;

private ExitApplication(){

}
public static ExitApplication getInstance(){
if(null==ea){
ea = new ExitApplication();
}
return ea;
}

/**
* 添加Activity到集合中
*/
public void addActivity(Activity activity){
list.add(activity);
}

public void exit(Context context){

Dialog dialog = new AlertDialog.Builder(context).setTitle("確認退出")
.setMessage("確定退出該系統?")
.setPositiveButton("確定",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
for(Activity activity:list){
activity.finish();
}
System.exit(0);
}
}).setNegativeButton("取消",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
}

}).create();
dialog.show();
}
}
我這個必須是單例的,因為我要確保把每個UI都加進一個集合中,所以...,至於對單例有疑問的,可以上網查詢,
然後在每個Activity的onCreate方法中調用ExitApplication.getInstance().addActivity(this);,然後在處理退出請求中直接調用ExitApplication.getInstance().exit(this);即可。
轉載

H. 如何使用android單例模式

java模式之單例模式:
單例模式確保一個類只有一個實例,自行提供這個實例並向整個系統提供這個實例。
特點:
1,一個類只能有一個實例
2,自己創建這個實例
3,整個系統都要使用這個實例

Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。在很多操作中,比如建立目錄
資料庫連接都需要這樣的單線程操作。一些資源管理器常常設計成單例模式。
外部資源:譬如每台計算機可以有若干個列印機,但只能有一個Printer
Spooler,以避免兩個列印作業同時輸出到列印機中。每台計算機可以有若干個通信埠,系統應當集中管理這些通信埠,以避免一個通信埠被兩個請求同時調用。內部資源,譬如,大多數的軟體都有一個(甚至多個)屬性文件存放系統配置。這樣的系統應當由一個對象來管理這些屬性文件。

一個例子:Windows
回收站。
在整個視窗系統中,回收站只能有一個實例,整個系統都使用這個惟一的實例,而且回收站自行提供自己的實例。因此,回收站是單例模式的應用。

兩種形式:
1,餓漢式單例類

public class Singleton {

private Singleton(){}

//在自己內部定義自己一個實例,是不是很奇怪?

//注意這是private 只供內部調用

private static Singleton instance =
new Singleton();

//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問

public static Singleton getInstance() {

return instance;

}

}

2,懶漢式單例類

public class Singleton {

private static Singleton instance = null;

public static synchronized Singleton
getInstance() {

//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次

//使用時生成實例,提高了效率!

if (instance==null)

instance=new Singleton();

return instance; }

}

第二中形式是lazy initialization,也就是說第一次調用時初始Singleton,以後就不用再生成了。

注意到lazy
initialization形式中的synchronized,這個synchronized很重要,如果沒有synchronized,那麼使用getInstance()是有可能得到多個Singleton實例。
一般來說第一種比較安全

我自己比較常用的方式:

public class Singleton {

private volatile static
Singleton singleton;

private Singleton(){}

public static Singleton getInstance(){

if(singleton==null){

synchronized(Singleton.class){

if(singleton==null){

singleton=new Singleton();

}

}

}

return singleton;

}

}

I. android開發時,怎麼使項目中所有的activity都是棧內單例模式

android:launchMode="singleInstance"

J. android 單例singleton可否用於多進程

單例模式(Singleton) 一、 什麼是單例模式 單例模式,簡單點來說就是設計一個類,使其在任何時候,最多隻有一個實例,並提供一個訪問這個實例的全局訪問點。 二、 為什麼要單例 在程序中的很多地方,只有一個實例是非常重要的

熱點內容
編程一首詩 發布:2025-02-06 06:45:04 瀏覽:528
驚聲尖笑5下載ftp 發布:2025-02-06 06:33:16 瀏覽:528
共享文件夾讓輸入密碼 發布:2025-02-06 06:32:28 瀏覽:970
收銀伺服器響應出錯什麼意思 發布:2025-02-06 06:24:43 瀏覽:607
sql用戶授權 發布:2025-02-06 06:24:42 瀏覽:677
蘋果手機相冊顯示正在上傳 發布:2025-02-06 06:05:43 瀏覽:542
hadoop下載文件夾 發布:2025-02-06 06:05:08 瀏覽:187
鎧最強配置是哪些 發布:2025-02-06 06:04:22 瀏覽:360
編譯器的製作環境 發布:2025-02-06 05:54:34 瀏覽:829
學車網源碼 發布:2025-02-06 05:47:40 瀏覽:386