奇葩问题排查--频繁设置字体导致程序卡死

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中设置字体时将返回一个原字体对象,而你必须在函数结束时将原字体对象设置回去,否则就有几率的导致程序出错,包括画笔、位图等也是一样,这也算是一个奇葩问题。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值