2014-09-11 26 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來調整號碼。