我希望我的应用程序在用户触摸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()吗?

谢谢,
汤姆

最佳答案

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

10-07 13:09