泄露了IntentReceiver android.widget.ZoomButtonsController?

时间:2010-08-09 06:14:00

标签: android

每当用户触摸GLSurfaceView时,我希望我的应用程序在GLSurfaceView上显示ZoomButtonsController。我的活动构造函数如下所示:

_zoomButtonsController = new ZoomButtonsController(_surface);
_zoomButtonsController.setAutoDismissed(true);            
_zoomButtonsController.setOnZoomListener(_zoomListener);  // Set listener

然后我覆盖onTouchEvent()以在用户生成ACTION_MOVE事件时使ZoomButtonsController可见:

/** Called when user generates touch event */
@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_MOVE:
        // Does this somehow register an IntentListener??? 
        if (_zoomButtonsController != null) {
            _zoomButtonsController.setVisible(true);
        }

应用程序似乎有效,直到我退出,此时我得到:

D/Solaris (22616): onDestroy() E/WindowManager(22616): Activity com.tomoreilly.solarisalpha.SolarisAlpha has leaked window android.widget.ZoomButtonsController$Container@4495c640 that was originally added here

并且堆栈跟踪指的是onTouchEvent中调用_zoomButtonsController.setVisible(true)的行。

这是为什么?为什么设置缩放按钮控制器也可以将其注册为目标侦听器?我怎么注销呢?我是否真的使用了正确的方法 - 即我应该从ZoomButtonsController.setVisible(true)内拨打Activity.onTouchEvent()吗?

谢谢, 汤姆

2 个答案:

答案 0 :(得分:3)

你为什么提到IntentReceivers?日志说你泄漏了一个窗口。您必须确保在退出时将缩放控制器的可见性设置为false以销毁关联的窗口。

答案 1 :(得分:0)

将此添加到您的活动中:

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