ConnectivityManager泄漏,不确定如何解决

时间:2017-01-02 18:08:09

标签: 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();
}

3 个答案:

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