最近在研究和Socket相关的一些东西,Java中的Socket还是比较易用的,但是比较坑爹的就是有时候Socket不管怎么发送,Server都接收不到,代码也没有任何反馈,这样就需要一个机制确认Socket的状态。方法有很多种,我这里采用了心跳,超时计时选用了CountDownTimer,原来也用过,也知道他内部使用Handler实现的,感觉能用还算靠谱吧。然后问题就出在把本地代码融到项目之后。
本地代码,经过我自己测试都没有什么问题,心跳也能实现。但是在融入项目之后,发现启动了两个tcp client 只有一个正常启动了!
经过断点debug之后,我发现在第二个client初始化的CountDownTimer的时候挂了,跟随初始化代码一路点进去,发现是Handler初始化的时候挂掉了。
了解Android消息机制的人看到这一定就知道原因了,对:不能在没有looper的线程中创建Handler,而CountDownTimer内部也用的是Handler,而项目中则是开启了一个线程执行任务,我这里刚好就踩到了这个坑,最后把CountDownTimer换成了Timer。