2015-09-05 94 views
6

context.getSystemService()昂貴的電話?context.getSystemService()是一個昂貴的調用嗎?

I.e.我建立了一個小的http網絡庫(我知道還有其他的http網絡庫可用),它使用ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);來檢查(在執行http請求之前)用戶是否連接到互聯網(某種失敗的快速策略)。

我的問題是我應該將ConnectivityManager保存爲我的http庫的實例變量(類字段)還是每次在我啓動一個http請求以檢索「新」ConnectivityManager之前調用ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);?每次我呼叫getSystemService(Context.CONNECTIVITY_SERVICE)時都會返回相同的ConnectivityManager實例(換句話說,可以將ConnectivityManger存儲到類字段中導致問題,因爲我的http庫是長期活的 - >只要應用程序運行,就會生存)

回答

5

我的問題是我應該保存ConnectivityManager作爲我的http庫的實例變量(類字段),或者我應該調用ConnectivityManager cm =(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);每次我啓動一個http請求來檢索一個「新」ConnectivityManager?

我會堅持實例。雖然getSystemService()在實踐中似乎並不昂貴,但爲什麼要多於需要呢?

換句話說,可以存儲ConnectivityManger成類字段導致問題,因爲我的HTTP庫是一個長期的生活一個 - >只要生命作爲應用程序運行

要爲安全方面,撥打getSystemService()上的Application單身(getApplicationContext())。 通常,由getSystemService()返回的對象對創建它的Context一無所知。偶爾,它會在Android 5.0中遭受此缺陷的影響,但它已在Android 5.1中修復。如果系統服務對象要超出我所處的環境,我傾向於使用getApplicationContext()來檢索系統服務,擺脫偏執狂。

(內存泄漏,他們出去找我!)

是一樣ConnectivityManager實例返回每次我打電話getSystemService(Context.CONNECTIVITY_SERVICE)時間

要誠實,我從未看過。