2014-09-11 27 views
0

这是我目前的学习练习,因为我最终要做的是创建一个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; 
     } 
    } 
} 
+0

上面的代码是否工作?你什么时候将'img'附加到容器?你实施'destroyItem'吗? – 2014-09-11 02:43:26

+0

'img'被返回,所以它是容器。 'destroyItem'被实现,它只是'container.removeView((View)object);' – 2014-09-11 18:04:31

回答

0

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

的所有非静态内部类(GestureListenerTouchAdapter)将有一个隐含的引用您的Activity,但他们没有一个较长的生命周期比Activity,因此,当你Activity被破坏,听众可以garbage-作为一个整体收集。

该进程持有的其他一些监听器可能有内存泄漏,您应该更加注意,比如LocationListener,所以如果您没有自己注销它,它将保持注册状态,并且如果您将其声明为非静态的内部类,这可能会泄漏内存。

0

代码没问题。

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