zoukankan      html  css  js  c++  java
  • Android中StackOverflow的问题

    最近出现了一个让人抓狂的问题。

          现在的项目中,制作了一个界面非常复杂。Fragment中嵌套下拉刷新的Listview

          这样一个布局,在3.0以上的手机上都表现良好问题!但是在2.x的比较弱爆的手机上会出现

           Android 2.3 I'm getting a StackOverflowError when the layout is drawn:

           at android.view.View.draw(View.java:6880)
           at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
          at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
           at android.view.View.draw(View.java:6883)
          at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
          at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
          ...

          栈溢出问题。各种谷歌之后发现,很多人在2.x上也会有这个问题,究其原因就是View的层次嵌套过多,而2.x上Android给UI主线程分配了大概8KB的栈空间。大概最多只会有60到80层的stack frame。这个空间存储不了我的这个布局,后分析发现,由于最里层嵌套了Listview ,每个Item都有很深,而且每个Item在不断的进行着重绘。最终导致了2.x机型的栈溢出问题。

          大部分的方法就是优化布局,减少嵌套。

          和网上说的一样,接下来就是不断的优化,能减极简。但是到最后优化到评论的listview的层次大概为16层,在部分的android 2.x上依旧报这个问题。如果要继续优化下去,就得去掉fragment。因为在观看布局时发现,v4包的fragment会在最外层添加一个NosavestateFramelayout。而我用到的是Fragment中嵌套了Fragment,这就导致平白无故多了两层。如果要保持我现在的布局就得考虑去掉Fragment,全部改用View。但是项目紧张,根本来不及切换过来。于是只能进行降级。

          当然还有一些比较不太优雅的解决方式:

          比如在你最深层次容易爆崩溃的View中,把所有的View都重写Draw方法

      private Handler mHandler =new Handler();
     
    @Overridepublicvoid draw(Canvas canvas){
     try{super.draw(canvas);
    
    }catch(StackOverflowError e){
    
                        mHandler.postDelayed(newRunnable(){publicvoid run(){
                                        invalidate();
    }
    },1);
    }
    }
    

      

                 虽然最好的方法仍然是去优化你的布局,解嵌套,不仅能加快页面渲染速度,还能解决此问题。但是实在是没有任何可优化的时候,只能先使用这种比较脏的方式。我最后使用的是进行了降级,因为项目紧张,而且不容有失,所以降级成了最保险的选择。对于2.x系统这种强加的限制,表示真的是太蛋疼了!

           The stack size of UI thread in Android 2.x is 12KB and in Android 4.x is 16KB. These 4KB make all the difference - since the above layout crashes on 2.x with StackOverflow.

          对于嵌套过深的地方,尤其当有listview时,一定要注意,能去fragment就去掉fragment!尽量直接换用ViewGroup

  • 相关阅读:
    struts2+Hibernate4+spring3+EasyUI环境搭建之四:引入hibernate4以及spring3与hibernate4整合
    struts2+Hibernate4+spring3+EasyUI环境搭建之三:引入sututs2以及spring与sututs2整合
    struts2+Hibernate4+spring3+EasyUI环境搭建之二:搭建spring
    Log4j
    【maven学习】构建maven web项目
    struts2+Hibernate4+spring3+EasyUI环境搭建之一:准备工作
    高版本myeclipse破解以及优化
    Eclipse&Myeclipse安装反编译插件
    Flask源码阅读-第四篇(flaskapp.py)
    Flask源码阅读-第三篇(flask\_compat.py)
  • 原文地址:https://www.cnblogs.com/renkangke/p/3534707.html
Copyright © 2011-2022 走看看