9

所以,我有这种方法可以让我知道用户是否有活动的互联网连接。它运作良好。但是,leak canary 发现了与connectivityManager 相关的内存泄漏。据我所知,我目前不会在我的代码中的任何地方关闭连接管理器。

我试图关闭 onDestroy 中的连接管理器。要么这不是一个选项,要么我不知道代码。说实话,我只是试图让自动填充告诉我该怎么做。没运气。

public static boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivityManager =(ConnectivityManager)  context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo =connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo !=null && activeNetworkInfo.isConnected();
}
4

3 回答 3

23

用它来防止泄漏,

ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
                .getSystemService(Context.CONNECTIVITY_SERVICE);
于 2017-01-02T18:28:51.473 回答
4

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

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

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

于 2017-07-21T10:32:54.303 回答
4

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

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

ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);

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

public class MyApp extends Application {
    @Override
    public void onCreate() {
         ConnectivityManager cm = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    }
}
于 2019-05-12T15:17:30.590 回答