智慧北京之堆栈溢出

在学习智慧北京新闻客户端的时候,在加载新闻中心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自己了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值