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)
这是 Android M 上的错误,已在 L 上修复。
原因是在 M 上,ConnectivityManager将第一个实例保存为静态对象。
当您第一次使用活动上下文获取它时,静态对象将始终引用您的活动。使用应用程序上下文将解决该问题。
分享一个新答案,因为有一个问题:
我尝试通过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)
| 归档时间: |
|
| 查看次数: |
1322 次 |
| 最近记录: |