ConnectivityManager泄漏,不知道如何解决

see*_*ess 5 android memory-leaks connectivity leakcanary

所以,我有这个方法让我知道用户是否有活跃的互联网连接.它运作良好.但是,泄漏金丝雀已识别出与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();
}
Run Code Online (Sandbox Code Playgroud)

san*_*mar 16

用它来防止泄漏,

ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
                .getSystemService(Context.CONNECTIVITY_SERVICE);
Run Code Online (Sandbox Code Playgroud)

  • @yotamhadas 这是因为在代码中的某个地方,您可能持有上下文的死引用并尝试注册 ConnectivityManager。在应用程序上下文中可以拯救我们因为它不会死直到应用程序被杀死。并且最好的做法是在应用程序级别而不是活动级别拥有 ConnectivityManage 和 wifiManager (2认同)

zhq*_*qin 8

这是 Android M 上的错误,已在 L 上修复。

原因是在 M 上,ConnectivityManager将第一个实例保存为静态对象。

当您第一次使用活动上下文获取它时,静态对象将始终引用您的活动。使用应用程序上下文将解决该问题。


Adi*_*Adi 7

分享一个新答案,因为有一个问题:

我尝试通过ConnectivityManager在我的活动中使用以下代码实例化来修复该错误:

ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);
Run Code Online (Sandbox Code Playgroud)

但是,这并没有解决内存泄漏问题。问题是,即使在调用我的活动之前,某些依赖库可能会ConnectivityManager在其代码中内部使用,这会导致上下文的静态变量被初始化为活动上下文。解决这个问题的技巧是ConnectivityManager在 Application 类中实例化,只是为了它(未使用)。

public class MyApp extends Application {
    @Override
    public void onCreate() {
         ConnectivityManager cm = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    }
}
Run Code Online (Sandbox Code Playgroud)