Android中StackOverflow的问题

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

      如今的项目中,制做了一个界面很是复杂。Fragment中嵌套下拉刷新的Listviewandroid

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

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

       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机型的栈溢出问题。post

 

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

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

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

      好比在你最深层次容易爆崩溃的View中,把全部的View都重写Draw方法blog

 

  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

相关文章
相关标签/搜索