这对我来说是一次学习练习,因为我最终要做的就是创建一个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 :(得分:0)
代码没问题。
PagerView不重用旧视图,但始终在内存中保留少量视图,这足以显示和缓存。您可以使用setOffscreenPageLimit
来调整号码。
答案 1 :(得分:0)
不,你的代码应该没问题。
您的所有非静态内部类(GestureListener
和TouchAdapter
)都会隐式引用您的Activity
,但它们的生命周期不会超过{{1}因此,当你的Activity
被销毁时,听众可以整体上被垃圾收集。
该进程持有的其他一些侦听器可能会有内存泄漏,您应该更加谨慎,比如Activity
,所以如果您不自行注销,它将保持注册状态,如果您将它声明为非静态内部类,这可能会泄漏内存。