这个嵌套类会导致内存泄漏吗?

时间:2014-09-11 01:40:08

标签: java android

这对我来说是一次学习练习,因为我最终要做的就是创建一个GestureListener对象并将其重新分配给所有新的MyTouchView个对象。

(为了简洁起见,我省略了一些必要的代码。)

对于下面的代码,

问题是:,是否会阻止(可能)许多GestureListener个对象的最终确定?如您所见,将创建许多GestureListener个对象 - 每次用户翻阅页面时都会创建一个。

public class MyActivity extends Activity

    // Widgets
    private ViewPager mViewPager;
    private TextView mTVPageCount;
    private TextView mTVTitle;
    private Button mBShare;
    private Button mBBack;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mTVPageCount = (TextView) findViewById(R.id.pagecount);
        mTVTitle = (TextView) findViewById(R.id.title);
        mBShare = (Button) findViewById(R.id.share);
        mBBack = (Button) findViewById(R.id.back);
    }

    private class TouchAdapter extends PagerAdapter {

        //pre-create neighboring views
        @Override
        public View instantiateItem(ViewGroup container, int position) {
                MyTouchView img = new MyTouchView(container.getContext());
                img.setOnDoubleTapListener(new GestureListener());
                return img;
        }
    }

    private class GestureListener implements GestureDetector.OnDoubleTapListener {

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            int iVisibility = mTVPageCount.getVisibility();
            int iNewVisibility;
            if (iVisibility == View.VISIBLE) {
                iNewVisibility = View.GONE;
            } else {
                iNewVisibility = View.VISIBLE;
            }
            mTVPageCount.setVisibility(iNewVisibility);
            mTVTitle.setVisibility(iNewVisibility);
            mBShare.setVisibility(iNewVisibility);
            mBBack.setVisibility(iNewVisibility);
            return true;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

代码没问题。

PagerView不重用旧视图,但始终在内存中保留少量视图,这足以显示和缓存。您可以使用setOffscreenPageLimit来调整号码。


答案 1 :(得分:0)

不,你的代码应该没问题。

您的所有非静态内部类(GestureListenerTouchAdapter)都会隐式引用您的Activity,但它们的生命周期不会超过{{1}因此,当你的Activity被销毁时,听众可以整体上被垃圾收集。

该进程持有的其他一些侦听器可能会有内存泄漏,您应该更加谨慎,比如Activity,所以如果您不自行注销,它将保持注册状态,如果您将它声明为非静态内部类,这可能会泄漏内存。