美文网首页
智慧北京之堆栈溢出

智慧北京之堆栈溢出

作者: 破荒之恋 | 来源:发表于2016-12-24 14:07 被阅读108次

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

相关文章

网友评论

      本文标题:智慧北京之堆栈溢出

      本文链接:https://www.haomeiwen.com/subject/rxglvttx.html