问题描述:我现在在做一个蓝牙通信的东西,现在要求如果数据接收超时,则在界面上显示相关的提示。因为安卓的BluetoothSocket里没有Socket中的setSoTimeout方法来判断,所以我的做法是用一个timer做为线程,timer每秒运行。在收到完整帧的时候(程序中有帧检测的功能),得到系统时间,然后在timer中的run中得到当前系统时间和完整帧的时间对比,超时5s则刷新界面。现在测试的情况是,在程序运行半个小时左右的时候,会跳出程序,然后后台收集到的错误是out of memory。我试过在各个地方加System.gc(),但没有效果,系统不理睬,没有回收垃圾,照样会out of memory。
 
另外,为什么我用timer做线程,但是却用系统设计来判断超时,而没有直接用timer呢?这是因为,我本来用timer来实现定时判断,但是发现记时在多次接收超时后会不准确...无奈之下,只能用系统时间来判断,关于这点,有高手知道的,也请加以指点!
 
求高手指教!万谢!

解决方案 »

  1.   

    1、根据你的描述,很有可能是内存泄露了。JAVA也有内存泄露的,特别是资源使用后未及时释放就会导致。你只能仔细分析程序,操作的时候查看堆增长,看看在哪一个步骤出现了异常。
    2、timeout本来就得你自己做,socket有timeout是API封装了而已。得自己做个watch dog判断超时。至于多次接受超时后不准确,肯定是你代码有问题。我猜测是你计时的方式不对,估计你在timer中用的是增量而不是快照来对时。简单的说,就是如果你想计算是否到达5秒,那么你应该在开始前用当前的时间加上5秒算出结束时间,然后在每一个ticket(onTimer)中去判断时间是否超时,或者在每一次onTimer的时候计算时间间隔并累加,而不是说定时器设置1秒执行一次,然后在回调中每次加1秒。