2015-09-05 82 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)时间

要诚实,我从未看过。