大家都知道使用socket通信的时候,inputstream(后面都用is替代了)的read()方法在是会阻塞的,若没有数据进来,就会一直停留在那句代码上。
在android上,个人比较懒,就把监听服务端的数据包这个任务放在了一个intentservice里面,但是intentService中一个死循环read()会让你很难退出这个循环,除非让服务端发送一个退出消息,处理这个消息之后退出。但是在客户端我们怎么自己把这个循环跳出,然后调用intentService.stopSelf()来关掉这个服务呢?
下面就是我们要做的:
1.由于一直保留着长连接,因此拿socket过来,调用socket.shutDownInput()来让这个socket的is.read()返回-1,这样我们的阻塞问题就解决了,代码就可以继续往下走了
2.找一个app全局变量存放一个是不是要关闭intentService的flag,在需要关闭的时候将flag设成true
3.在intentService的死循环里面,在is.read()的下一句来判断这个flag是不是为true,若是true,则调用intentService.stopSelf()关闭intentService
以此铭记