android中setTextSize调用太频繁在双核机器上会导致程序卡死。
昨天帮同事排查一死机问题,同事说打印出来值都没问题,可就是会死机。
程序大致是这样:
GameSurfaceView继承自SurfaceView类,
GameAnimation是一个自定义的类,用于刷新某个部位包括图片和文字
GameSurfaceView中有多个GameAnimation实例
GameSurfaceView的draw方法中会调用GameAnimation的draw方法
GameAnimation的draw方法中调用了setTextSize来设置字体(实际字体是一样的)
GameAnimation的draw方法中的Canvas和Paint都是从GameSurfaceView中传递的
GameSurfaceView在线程中循环的调用draw方法,也就是说GameAnimation会执行很多次的setTextSize,有时就会导致了程序卡死。
我将GameAnimation的draw中的setTextSize删除,放到GameSurfaceView的draw方法中,每次draw只执行一次设置字体,程序就不会卡死了。
虽然没有找到程序出错的根本原因(别人的代码总是比较难维护),但误打误撞总算解决了这个奇葩问题。
排查过程:
开始以为是声音卡死,就屏蔽了声音播放的代码,测试发现还是会出现卡死
然后以为刷新部位在屏幕以外导致的,就把左边强制设定到屏幕以内,测试还是会卡死
然后就把所有跟文字相关内容都给屏蔽了,发现竟然好了
于是一点点的放开,当放开setTextSize时,卡死现象又出现了
于是放开其他所有程序,只将setTextSize屏幕,无卡死现象,至此可以确定是该处调用了该函数间接的导致了卡死现象
后将该函数放到GameSurfaceView的draw中(这样每次只需调用一次),测试后无卡死现象
O了,我可以肯定程序中还有隐患,但还是省省时间吧,该程序没这么高的安全性要求。
记得以前搞wince编程的时候也有频繁调用设置字体出错问题,不过那还不一样,wince中设置字体时将返回一个原字体对象,而你必须在函数结束时将原字体对象设置回去,否则就有几率的导致程序出错,包括画笔、位图等也是一样,这也算是一个奇葩问题。