android.view.WindowLeaked: Activity has leaked window android.widget.ZoomButtonsController$Container that was originally added here 安卓视窗泄漏:活动泄漏了安卓小部件ZoomButtonsController$Container,最初是在这里添加的。

8

我正在处理与地图相关的内容,当无网络连接时,我会启动一个活动并使用离线地图(MapQuest)。这个活动可以正常运行,地图会被显示,并且所有的叠加层、标记等都会被正确处理。当用户点击其中一个标记信息窗口后,另一个活动就会启动,此时我在日志中会看到一堆红色错误消息,但是应用程序并不会崩溃。这些消息(标题中包含init)似乎在谈论ZoomButtons和触摸事件。至于代码中的ZoomButtons或触摸事件(多点触控),只有两行:

map.setBuiltInZoomControls(true);
map.setMultiTouchControls(true);

而不是任何对话框...

  • 如果我写:

    map.setBuiltInZoomControls(false); map.setMultiTouchControls(false);

红色错误信息消失了,但是用户当然无法以任何方式缩放...

由于错误(使用“true”参数时)仅在启动另一个活动时发生,因此我认为我必须在on pause()中添加一些内容:

onPause(){
map.setBuiltInZoomControls(false);
map.setMultiTouchControls(false);
super.OnPause();
}

——但这样做并没有改变任何事情……有什么提示吗?-提前致谢!


2
我自己找到了答案(不是解决方案): 当我点击标记并打开infoWindow时,osmdroid的zoomButtons出现了(它们必须有一些监听器获取地图上的轻击)。如果我在它们始终存在的情况下单击infoWindow(以启动第二个活动),则会发生错误。如果我等待它们消失:没有错误。 因此,我可能需要查看osmdroid源代码,以查看是否可以更改zoomButtons的出现/消失行为,这实际上并不是很有用。 - Philippe Castellin
多亏了你和Noni,我才能处理这个问题!谢谢! - Jenix
在此记录在osmdroid问题跟踪器上的详细信息:https://github.com/osmdroid/osmdroid/issues/328 - spy
3个回答

16

将此添加到您的活动中:

@Override
public void finish() {
    ViewGroup view = (ViewGroup) getWindow().getDecorView();
    view.removeAllViews();
    super.finish();
}

8
我遇到了完全相同的问题...感谢你指出这可能是由于放大控件仍然可见造成的。我进行了测试,结果证实了这一点。当我按下带有放大控件的返回按钮时,会显示泄漏错误,如果等到控件消失(在停止滚动后它们会自动消失),那么就不会有泄漏错误。
WebSettings 中进行了一些研究,找到了一个方法可以隐藏放大控件,这意味着你可以随时按下返回按钮而不会发生泄漏。但是它仍然可以使用捏合效果进行缩放。唯一的缺点是你的控件不会显示。但对我来说,这是值得的,因为大多数用户都知道所有应用程序都支持捏合缩放。
以下是我使用的代码:
// make sure your pinch zoom is enabled
 webView.getSettings().setBuiltInZoomControls(true);

// don't show the zoom controls
 webView.getSettings().setDisplayZoomControls(false);

移除泄漏的按钮是一个解决方案吗?通常情况下,开发人员认为它们很有用,所以会留下来。 - tony gil

1
这个泄漏窗口的问题在Android 3.0版本之后不再存在,因此您可以尝试执行以下操作:
    // enabled zoom support
    getSettings().setSupportZoom(true);
    getSettings().setBuiltInZoomControls(true);

    // but,We should hide this button, otherwise in the version
    // of Android 3 and above, there is a window leak.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // call requies API Level 11 ( Android 3.0 + )
        getSettings().setDisplayZoomControls(false);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接