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);
    }
}