所以,我有这种方法,让我知道用户是否有活跃的互联网连接。它运作良好。但是,泄漏金丝雀已识别出与connectivityManager相关的内存泄漏。我目前没有在我知道的任何时候在我的代码中的任何地方关闭connectivityManager。
我试图关闭onDestroy中的connectivityManager。这不是一个选项,或者我不知道代码。说实话,我只是试着让自动填充告诉我该怎么做。没有运气。
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivityManager =(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo =connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo !=null && activeNetworkInfo.isConnected();
}
答案 0 :(得分:15)
使用它来防止泄漏,
ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
答案 1 :(得分:2)
这是Android M上的一个错误,已在L上修复。
原因是在M上,ConnectivityManager
将第一个实例保存为静态对象。
当您首先使用活动上下文获取它时,静态对象将始终引用您的活动。使用应用程序上下文将解决问题。
答案 2 :(得分:1)
在遇到问题时分享新答案:
我尝试通过在活动中使用以下代码实例化ConnectivityManager
来修复该错误:
ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
但是,这不能解决内存泄漏问题。问题在于,即使在调用我的活动之前,某些依赖库也可能在其代码内部使用ConnectivityManager
,这导致上下文的静态变量被初始化为活动上下文。解决此问题的技巧是仅出于它的目的(未使用)在Application类中实例化ConnectivityManager
。
public class MyApp extends Application {
@Override
public void onCreate() {
ConnectivityManager cm = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
}
}