context.getSystemService()
是一个昂贵的电话吗?
即。我已经构建了一个小的http网络库(我知道还有其他可用的http网络库),如果用户与互联网连接,那么使用ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
来检查(在执行http请求之前)(一种失败的快速策略) 。
我的问题是我应该将ConnectivityManager
保存为我的http库的实例变量(类字段),还是应该在每次启动http请求之前调用ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
来检索“新” ConnectivityManager?每次调用getSystemService(Context.CONNECTIVITY_SERVICE)
时都会返回相同的ConnectivityManager实例(换句话说,可以将ConnectivityManger存储到类字段中导致问题,因为我的http库是一个长期存在的问题 - >只要应用程序运行就会存在)
答案 0 :(得分:7)
我的问题是我应该将ConnectivityManager保存为我的http库的实例变量(类字段),还是应该调用ConnectivityManager cm =(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);每次我开始一个http请求之前检索一个" new" ConnectivityManager?
我会抓住这个实例。虽然getSystemService()
在实践中看起来并不昂贵,但为什么要比经常更频繁地调用它?
换句话说,可以将ConnectivityManger存储到类字段中导致问题,因为我的http库是一个很长的生存者 - >只要应用程序运行就会存在
为安全起见,请致电getSystemService()
单身人士Application
上的getApplicationContext()
。 通常,getSystemService()
返回的对象对创建它的Context
一无所知。有时候,Android 5.0中的CameraManager
遭遇了这个漏洞,虽然在Android 5.1中已经修复了。如果系统服务对象将比我所处的上下文更活跃,我倾向于使用getApplicationContext()
来解析系统服务,而不是偏执狂。
(内存泄漏,他们出去找我!)
每次调用getSystemService时都返回相同的ConnectivityManager实例(Context.CONNECTIVITY_SERVICE)
说实话,我从未看过。