在学习智慧北京新闻客户端的时候,在加载新闻中心list页面图片时,出现了堆栈内存溢出的问题,报错信息如下:
08-06 07:34:42.222: E/AndroidRuntime(807): FATAL EXCEPTION: main
08-06 07:34:42.222: E/AndroidRuntime(807): java.lang.stackoverflowerror
08-06 07:34:42.222: E/AndroidRuntime(807): at android.view.View.invalidate(View.java:8429)
08-06 07:34:42.222: E/AndroidRuntime(807): at android.widget.TextView.invalidateDrawable(TextView.java:4573)
08-06 07:34:42.222: E/AndroidRuntime(807): at android.graphics.drawable.DrawableContainer.invalidateDrawable(DrawableContainer.java:241)
08-06 07:34:42.222: E/AndroidRuntime(807): at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:350)
08-06 07:34:42.222: E/AndroidRuntime(807): at android.graphics.drawable.NinePatchDrawable.setAlpha(NinePatchDrawable.java:206)
08-06 07:34:42.222: E/AndroidRuntime(807): at android.graphics.drawable.DrawableContainer.jumpToCurrentState(DrawableContainer.java:170)
08-06 07:34:42.222: E/AndroidRuntime(807): at android.view.View.jumpDrawablesToCurrentState(View.java:11557)
08-06 07:34:42.222: E/AndroidRuntime(807): at android.widget.TextView.jumpDrawablesToCurrentState(TextView.java:4507)
08-06 07:34:42.222: E/AndroidRuntime(807): at android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5009)
08-06 07:34:42.222: E/AndroidRuntime(807): at android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5009)
08-06 07:34:42.222: E/AndroidRuntime(807): at android.widget.FrameLayout.jumpDrawablesToCurrentState(FrameLayout.java:172)
08-06 07:34:42.222: E/AndroidRuntime(807): at android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5009)
在网上找了一些资料看了,知道出现这种堆栈溢出一般就是死循环调用导致,不然就是层次关系嵌套太深。自己在代码里面找了半天,居然没有看出哪里使用了循环,层次关系嵌套也不深啊!我要崩溃了,无从下手,不知道怎么弄了。后来问了一个工作的师兄,恰好师兄出去了,没开电脑,只能把报错信息粘过去请教,打断点,一点一点的调试,最后确定在返回的view对象有问题,然后加到viewpager中显示就出现了上面的错误,找了一下也没找出view哪里不对,最后发现addview(view)中的view居然是父类中的视图,因为另一个子类也继承了父类,视图是自己实现的,而当前类也继承了同一父类,相当于addview的时候add了自己,这才导致了堆栈溢出。所以问题就出现在获取view对象这里。
当前类和NewsCenerListPager继承了同一父类,getRootView()是子类自己实现的。
// 加载新闻页面的数据
NewsCenterNewsItemBean bean = mPagerData.get(position);
// 获取数据
NewsCenerListPager newsPager=new NewsCenerListPager(mContext,bean);
//加载视图
View view=getRootView();
//TODO 图片视图加载不上去
container.addView(view);
//加载数据
newsPager.initData();
return view;
正确代码改为:如下
// 加载新闻页面的数据
NewsCenterNewsItemBean bean = mPagerData.get(position);
// 获取数据
NewsCenerListPager newsPager=new NewsCenerListPager(mContext,bean);
//加载视图
View view=newsPager.getRootView();
//TODO 图片视图加载不上去
container.addView(view);
//加载数据
newsPager.initData();
return view;
看到没有,就一个单词的差别,花费了了半天的。没有newsPager就是相当于自己add自己了。
网友评论