问题描述:我现在在做一个蓝牙通信的东西,现在要求如果数据接收超时,则在界面上显示相关的提示。因为安卓的BluetoothSocket里没有Socket中的setSoTimeout方法来判断,所以我的做法是用一个timer做为线程,timer每秒运行。在收到完整帧的时候(程序中有帧检测的功能),得到系统时间,然后在timer中的run中得到当前系统时间和完整帧的时间对比,超时5s则刷新界面。现在测试的情况是,在程序运行半个小时左右的时候,会跳出程序,然后后台收集到的错误是out of memory。我试过在各个地方加System.gc(),但没有效果,系统不理睬,没有回收垃圾,照样会out of memory。
另外,为什么我用timer做线程,但是却用系统设计来判断超时,而没有直接用timer呢?这是因为,我本来用timer来实现定时判断,但是发现记时在多次接收超时后会不准确...无奈之下,只能用系统时间来判断,关于这点,有高手知道的,也请加以指点!
求高手指教!万谢!
另外,为什么我用timer做线程,但是却用系统设计来判断超时,而没有直接用timer呢?这是因为,我本来用timer来实现定时判断,但是发现记时在多次接收超时后会不准确...无奈之下,只能用系统时间来判断,关于这点,有高手知道的,也请加以指点!
求高手指教!万谢!
解决方案 »
- javaweb 与android 通信
- Android休眠和唤醒
- 怎么获取一个AlertDialog中的EditText中输入的内容?
- Spinner取值问题
- 有没有人推荐一个Android开发群。
- 酷我听听 tab 滑动效果
- Notification 中实现 progressBar 遇到 RemoteViews 取packageName问题
- GitHub里ActiveAndroid 项目 用于SQLite的ORM框架 表自动创建问题
- fragment中 getActivity 报空指针
- 想写个更改手机位置的app怎么实现,有root权限
- Android background问题 求帮助
- 下载好了android SDK 但是连接真手机,打开hierarchyviewer.bat,手机屏幕图像显示倒立
2、timeout本来就得你自己做,socket有timeout是API封装了而已。得自己做个watch dog判断超时。至于多次接受超时后不准确,肯定是你代码有问题。我猜测是你计时的方式不对,估计你在timer中用的是增量而不是快照来对时。简单的说,就是如果你想计算是否到达5秒,那么你应该在开始前用当前的时间加上5秒算出结束时间,然后在每一个ticket(onTimer)中去判断时间是否超时,或者在每一次onTimer的时候计算时间间隔并累加,而不是说定时器设置1秒执行一次,然后在回调中每次加1秒。