ConnectivityManager 泄漏,不确定如何解决
ConnectivityManager leaking, not sure how to resolve
所以,我有这个方法可以让我知道用户是否有活动的互联网连接。它运作良好。但是,leak canary 已识别出与 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();
}
用这个来防止泄漏,
ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
这是 Android M 上的错误,已在 L 上修复。
原因是在 M 上,ConnectivityManager
将第一个实例保存为静态对象。
当您第一次使用 Activity 上下文获取它时,静态对象将始终引用您的 Activity。使用应用程序上下文将解决问题。
分享一个新的答案,因为有一个陷阱:
我尝试通过在 activity 中使用以下代码实例化 ConnectivityManager
来修复错误:
ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
但是,这并没有解决内存泄漏问题。问题是,甚至在我的 activity 被调用之前,一些依赖库可能在其代码中内部使用 ConnectivityManager
,这导致上下文的静态变量被初始化为 activity 上下文。解决这个问题的技巧是在应用程序 class 中实例化 ConnectivityManager
只是为了它(未使用)。
public class MyApp extends Application {
@Override
public void onCreate() {
ConnectivityManager cm = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
}
}
所以,我有这个方法可以让我知道用户是否有活动的互联网连接。它运作良好。但是,leak canary 已识别出与 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();
}
用这个来防止泄漏,
ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
这是 Android M 上的错误,已在 L 上修复。
原因是在 M 上,ConnectivityManager
将第一个实例保存为静态对象。
当您第一次使用 Activity 上下文获取它时,静态对象将始终引用您的 Activity。使用应用程序上下文将解决问题。
分享一个新的答案,因为有一个陷阱:
我尝试通过在 activity 中使用以下代码实例化 ConnectivityManager
来修复错误:
ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
但是,这并没有解决内存泄漏问题。问题是,甚至在我的 activity 被调用之前,一些依赖库可能在其代码中内部使用 ConnectivityManager
,这导致上下文的静态变量被初始化为 activity 上下文。解决这个问题的技巧是在应用程序 class 中实例化 ConnectivityManager
只是为了它(未使用)。
public class MyApp extends Application {
@Override
public void onCreate() {
ConnectivityManager cm = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
}
}