- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有来自泄漏金丝雀的以下堆栈跟踪,我不确定我的 Activity 是如何泄漏的
static LGCobtextHelper.mLGContext
references LGContext.mContext
references
ResourcesContextWrapperFactory$WebViewContextWrapper.mBase
references
com.*.*.activity.MyActivity.networkMonitor
references
com.*.*.NetworkMonitor.mPendingResult
references
android.app.LoadedApk$ReceiverDispatcher$Args.this$0
references
LoadedAok$ReceiverDispathcer.mContext
leaks MyActivity instance
MyActivity
扩展了 BaseActivity
,它注册了 onResume()
并注销了 onPause()
,所以不确定哪个泄露 Activity
网络监控.java
public class NetworkMonitor extends BroadcastReceiver {
private final WebSocketClient webSocketClient;
private final ArmingHelper armingHelper;
private final ShutdownManager shutdownManager;
private final CameraThumbnailCache cameraThumbnailCache;
private final CameraAccessManager cameraAccessManager;
private final JoustLogger joustLogger;
private Activity registeredActivity;
private String currentNetworkName;
private List<NetworkStatusChangeListener> networkChangeListeners;
public interface NetworkStatusChangeListener {
void onNetworkUp();
void onNetworkDown();
}
public NetworkMonitor(WebSocketClient webSocketClient, ArmingHelper armingHelper, ShutdownManager shutdownManager, CameraThumbnailCache cameraThumbnailCache, CameraAccessManager cameraAccessManager, JoustLogger joustLogger) {
this.webSocketClient = webSocketClient;
this.armingHelper = armingHelper;
this.shutdownManager = shutdownManager;
this.cameraThumbnailCache = cameraThumbnailCache;
this.cameraAccessManager = cameraAccessManager;
this.joustLogger = joustLogger;
networkChangeListeners = new ArrayList<>();
}
// Activities *must* call this method in onResume() in order for
// the app to watch for network changes
public void startListeningForNetworkChanges(Activity registeringActivity) {
if (!(registeringActivity instanceof NetworkStatusChangeListener)) {
throw new IllegalArgumentException("Registering Activity must implement NetworkStatusChangeListener");
}
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intentFilter.addAction(GlobalConstants.ANDROID_NET_WIFI_WIFI_STATE_CHANGED);
registeringActivity.registerReceiver(this, intentFilter);
this.registeredActivity = registeringActivity;
registerListenerForNetworkChanges((NetworkStatusChangeListener)registeringActivity);
}
// Activities *must* call this method in onPause() in order to properly
// unregister the receiver that was set in onResume()
public void stopListeningForNetworkChanges(Activity registeringActivity) {
registeringActivity.unregisterReceiver(this);
unregisterListenerForNetworkChanges((NetworkStatusChangeListener)registeringActivity);
registeredActivity = null;
}
// Fragments can use this method to register for Network change updates, call in onResume()
public void registerListenerForNetworkChanges(NetworkStatusChangeListener listener) {
networkChangeListeners.add(listener);
}
// Fragments need to unregister in onPause()
public void unregisterListenerForNetworkChanges(NetworkStatusChangeListener listener) {
networkChangeListeners.remove(listener);
}
@Override
public void onReceive(Context context, Intent intent) {
checkNetworkConnection();
}
public void checkNetworkConnection() {
if (registeredActivity != null) {
final ConnectivityManager connectivityManager = (ConnectivityManager) registeredActivity.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnectedOrConnecting()) {
String newNetworkName = networkInfo.getTypeName();
if (currentNetworkName == null || !currentNetworkName.equals(newNetworkName)) {
Timber.d("Network(%s) Connected", newNetworkName);
// Our network was down, but now it's up. Validate the Websocket
currentNetworkName = newNetworkName;
cameraThumbnailCache.clearInternalURLPreferences();
webSocketClient.reopenWebsocketIfPossible();
cameraAccessManager.onNetworkUp();
if (ActivityBehaviorHelper.needsSecurityCountdown(registeredActivity)) {
armingHelper.startTimerIfReady();
}
for (NetworkStatusChangeListener listener : networkChangeListeners) {
listener.onNetworkUp();
}
joustLogger.onNetworkUp();
}
} else {
Timber.w("Network Down");
currentNetworkName = null;
cameraAccessManager.onNetworkDown();
joustLogger.onNetworkDown();
shutdownManager.onNetworkDown();
for (NetworkStatusChangeListener listener : networkChangeListeners) {
listener.onNetworkDown();
}
}
}
}
}
BaseActivity.java
@Override
protected void onResume() {
super.onResume();
networkMonitor.startListeningForNetworkChanges(this);
}
@Override
protected void onPause() {
networkMonitor.stopListeningForNetworkChanges(this);
super.onPause();
}
最佳答案
看起来您可能不需要在该 NetworkMonitor 类中保留对 Activity 的引用。这可能是您的内存泄漏的根源 - Activity 引用可能在 Activity 被销毁后被保留。看起来您可以将上下文作为参数传递给需要它的方法。
此外,对于此处使用 Activity 上下文的一些地方,例如 context.getSystemService(Context.CONNECTIVITY_SERVICE),您可以改用 Application 上下文,并且可能完全避免需要 Activity 引用。
关于android - leakcanary stacktrace 难以理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37148889/
LeakCanary 是一个适用于 Android 和 Java 的内存泄漏检测库。 LeakCanary 我的项目是基于android的make文件系统,它依赖于一些android内部接口(inte
我正在使用 LeakCanary,但堆分析结果没有提供足够的信息来检测任何泄漏。它只提到 Activity 正在泄漏。 D/LeakCanary: ====================
这有点奇怪,或者我对依赖关系有一些误解。如何仅通过将 LeakCanary 添加到应用程序的 Gradle 文件中的依赖项来安装并准备好观察我的应用程序是否存在内存泄漏? 最佳答案 在 Android
我在我的应用程序中使用了 LeakCanary,我已经关注了 this在应用程序中进行设置的指南。每当应用程序发生泄漏时,LeakCanary 都会在应用程序中显示泄漏通知,而且我能够在手机存储中找到
LeakCanary documentation提到以下用于处理构建类型的内容: dependencies { debugCompile 'com.squareup.leakcanary:le
我有这个泄漏,任何猜测?这个类有一些奇怪的引用。我的代码的任何地方都没有 contentobserver In com.example:1.5.0:27. com.example.ui.record
每次我尝试显示 DialogFragment 时都会出现内存泄漏。 这就是我的测试对话框(取自 Android 开发者页面)的样子: public class TestDialog extends D
最近我开始使用LeakCanary。我这是我的堆栈跟踪: com.my.app.ui.menu.MenuActivity has leaked: D/LeakCanary: * GC ROOT sta
我有来自泄漏金丝雀的以下堆栈跟踪,我不确定我的 Activity 是如何泄漏的 static LGCobtextHelper.mLGContext references LGContext.mCont
below is my leak report captured by leak canary but i am not able to detect from where it keeps refe
TLDR:我必须扩展应用程序类,但不知道从哪里开始。 好吧...我知道这是一个愚蠢的问题,但我不得不问。 我需要安装 LeakCanary,我在他们的文档中看到它要求我将代码放入应用程序类中。 我了解
谁能给我一个如何从 LeakCanary 中忽略某些类的工作示例? 我正在查看此示例以忽略 LeakCanary 中第三方库中的某些类,但我无法弄清楚将其放在我的应用程序中的什么位置。我把它放在我的应
我这样做: ExcludedRefs excludedRefs = AndroidExcludedRefs.createAppDefaults() .clazz("an
我已经安装了 LeakCanary 以查看我的应用程序是否存在内存泄漏。 看起来是这样,但是我看不到日志,谁能告诉我怎么做,或者给出我找不到的好的教程??? 在 github 中的文档中,它说: On
我对 LeakCanary 的行为有点困惑,我希望 SO 可以帮助我解决这个问题。我已将 LeakCanary 添加到我的应用程序,并且我看到一个弹出窗口声称存在泄漏。 这肯定看起来像这里提到的 In
我的 Android 应用有第三种构建类型“qa”。我遵循了 LeakCanary 网站上的这些说明:“如果您有除调试和发布之外的其他构建类型,您也需要为它们添加特定的依赖项 (xxxCompile)
我们集成了 LeakCanary 来帮助我们解决我们认为是内存泄漏的问题。为了确保我们的每件事都设置正确,我创建了一个不会被删除的静态引用,并告诉 leakCanary 观看它, public cla
build.gradle 已按照 github insturctions 进行配置。LeakCanary 类似乎不包括在内。 dependencies { debugCompile 'com.
我决定是时候学习如何使用 Leak Canary 来检测我的应用程序中的泄漏了,并且像往常一样,我尝试在我的项目中实现它以真正了解如何使用该工具。实现它很容易,困难的部分是阅读该工具向我抛出的内容。我
LeakCanary 可以用在非 Android 应用上吗?例如,在 JavaFx 应用程序中? 最佳答案 简短的回答是不可以。 LeakCanary documentation site是这样说的:
我是一名优秀的程序员,十分优秀!