Android中的單例與應用程序上下文?

回顧這篇文章,列舉了使用單例的幾個問題,並看到了幾個使用單例模式的Android應用程序的示例,我想知道使用單例而不是經過全局應用程序狀態共享的單個實例(將android.os.Application子類化並獲取它)是不是一個好主意。經過context.getApplication())。 android

兩種機制都有哪些優勢/缺點? 緩存

坦白地說,我但願在此後的Singleton模式與Web應用程序中獲得相同的答案,這不是一個好主意! 但適用於Android。 我對麼? 不然DalvikVM有什麼不一樣? 多線程

編輯:我想對涉及的幾個方面有意見: 框架

  • 同步化
  • 可重用性
  • 測試中

#1樓

個人活動調用了finish()(不會當即完成,但最終會完成)並調用Google Street Viewer。 當我在Eclipse上進行調試時,調用Street Viewer時我與應用程序的鏈接斷開,我理解爲(整個)應用程序已關閉,以釋放內存(由於單個活動完成不該致使此行爲) 。 不過,我能夠經過onSaveInstanceState()將狀態保存在Bundle中,並在堆棧中下一個活動的onCreate()方法中將其還原。 經過使用靜態單例或子類化Application,我將面臨應用程序的關閉和丟失狀態(除非我將其保存在Bundle中)。 所以,根據個人經驗,它們在國家保護方面是相同的。 我注意到該鏈接在Android 4.1.2和4.2.2中丟失了,但在4.0.7或3.2.4中卻沒有丟失,據我瞭解,這代表內存恢復機制已在某個時候發生了變化。 模塊化


#2樓

申請與單身人士不一樣,緣由以下: 測試

  1. 應用程序的方法(如onCreate)在ui線程中調用;
  2. 單例方法能夠在任何線程中調用;
  3. 在應用程序的「 onCreate」方法中,能夠實例化Handler。
  4. 若是單例在none-ui線程中執行,則沒法實例化Handler;
  5. 應用程序具備管理應用程序中活動生命週期的能力。它具備「 registerActivityLifecycleCallbacks」方法。可是單身人士沒有能力。

#3樓

個人2美分: ui

我確實注意到,當個人活動被破壞時,某些單例/靜態字段已重置。 我在一些低端2.3設備上注意到了這一點。 spa

個人狀況很簡單:我只有一個私有文件「 init_done」和一個從activity.onCreate()調用的靜態方法「 init」。 我注意到方法初始化是在從新建立活動時從新執行自身。 線程

雖然我沒法證實個人確定,可是這可能與首先建立/使用單例/類的時間有關。 當該活動被銷燬/回收時,彷佛只有該活動引用的全部類也都被回收了。 設計

我將單例實例移至Application的子類。 我從應用程序實例訪問它們。 從那之後,再也沒有發現問題。

我但願這能夠幫助某人。


#4樓

它們其實是相同的。 我能夠看到一個區別。 使用Application類,能夠在Application.onCreate()中初始化變量,並在Application.onTerminate()中銷燬它們。 使用Singleton,您必須依靠VM初始化和銷燬​​靜態數據。


#5樓

我很是推薦單身人士。 若是您有須要上下文的單例,請執行如下操做:

MySingleton.getInstance(Context c) {
    //
    // ... needing to create ...
    sInstance = new MySingleton(c.getApplicationContext());
}

與應用程序相比,我更喜歡單例,由於它有助於使應用程序更加組織化和模塊化-而不是在一個地方須要維護應用程序的全部全局狀態,每一個單獨的地方均可以照顧好本身。 一樣,單身人士懶惰地初始化(應要求)而不是引導您沿着Application.onCreate()進行全部初始化的路徑這一事實也很好。

使用單例並無本質上的錯誤。 只要有意義,請正確使用它們。 Android框架實際上有不少,由於它能夠維護加載資源和其餘相似東西的按進程緩存。

一樣對於簡單的應用程序,單例也不會出現多線程問題,由於經過設計,應用程序的全部標準回調都在進程的主線程上分派,所以除非您經過線程或線程明確引入多線程,不然不會發生多線程事件。經過將內容提供者或服務IBinder發佈到其餘進程來隱式地進行。

只要考慮一下本身在作什麼。 :)

相關文章
相關標籤/搜索