即我已经构建了一个小的http网络库(我知道还有其他可用的http网络库),它使用ConnectivityManager cm =(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);检查(在执行http请求之前)用户是否与互联网连接(一种失败的快速策略).
我的问题是我应该将ConnectivityManager保存为我的http库的实例变量(类字段),还是应该调用ConnectivityManager cm =(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);每次我启动http请求以检索“新”ConnectivityManager之前?每次调用getSystemService(Context.CONNECTIVITY_SERVICE)时都返回相同的ConnectivityManager实例(换句话说,可以将ConnectivityManger存储到类字段中导致问题,因为我的http库是一个很长的生存者 – >只要应用程序存在跑)
解决方法
My question is should I save the ConnectivityManager as an instance variable (class field) of my http library or should I call ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); every time before I start an http request to retrieve a “new” ConnectivityManager?
我会抓住这个实例.虽然getSystemService()在实践中似乎没有那么昂贵,但为什么要比经常更频繁地调用它?
in other words,can storing a ConnectivityManger into a class field lead to problems since my http library is a long living one –> lives as long as application run
为了安全起见,在Application singleton(getApplicationContext())上调用getSystemService().通常,getSystemService()返回的对象对创建它的Context一无所知.有时候,确实如此 – Android 5.0中的CameraManager遭遇了这个漏洞,虽然这在Android 5.1中得到了修复.如果系统服务对象将比我所处的上下文更长,我倾向于使用getApplicationContext()来解决系统服务,而不是偏执狂.
(内存泄漏,他们出去找我!)
Is the same ConnectivityManager instance returned every time I call getSystemService(Context.CONNECTIVITY_SERVICE)
说实话,我从来没有看过.