android 蓝牙(二)——接收数据
分类: android 蓝牙开发 2014-04-27 14:28 395 人阅读 评论(0) 收藏 举报
在蓝牙开发中,我们有这样的一个需求:我们的 android 客户端要始
终保持和蓝牙的连接,当蓝牙有数据返回的时候,android 客户端就要
及时的收取数据,当蓝牙没有数据返回的时候我们就要保持 android 客
户端和蓝牙之间的连接。这个时候我们就要采取 socket 来实现和蓝牙
之间的连接。做项目使用过 http 轮询去获取数据,但是发现那样总是有
一定的弊端。于是就才用了 socket 方式去获取数据。
实现步骤:1、启动一个 service 去监听是否有数据返回。一旦有数
据返回就启动一个线程去处理数据
2、处理完数据,通过广播去通知 UI。
在开发中,如果采用循环方式去监听数据很容易产生一些 bug。因
为 java 中的 socket 默认是阻塞的,循环有可能会造成退出不了。我自
己用了几个状态值来实现对其的控制
service 类
[java] view plaincopy
1. /**
*
2.
3.
* @author li
*负责监听启动应用程序 后的接收数据
4.
5.
*/
6. public class ReceiveThread extends Service {
7.
8.
9.
private Socket socket;
private String workStatus;// 当前工作状况,null 表示正在处理,success 表示处
理成功,failure 表示处理失败
10.
public static Boolean mainThreadFlag = true;
; //状态
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
private void doListen()
{
Log.d("chl", "doListen()");
//开始监听
while (mainThreadFlag)
{
//开始监听数据
new Thread(new ThreadReadWriterSocketServer(ReceiveThread.this, so
cket));
}
}
24.
25.
26.
27.
28. }
Thread
[java] view plaincopy
this.context=context;
this.client=client;
Socket client=null;
private
private Context context=null;
public ThreadReadWriterSocketServer(Context context,Socket client)
{
1. public class ThreadReadWriterSocketServer implements Runnable{
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21. }
private void Receive() {
//处理数据
}
}
}
@Override
public void run()
{
Receive();