音频应用   音频插件联盟,正版插件,欢迎大家选择!

 找回密码
 快速注册

QQ登录

只需一步,快速开始

阅读: 27411|回复: 0

[资讯] 开启 mAcceptThread 线程 蓝牙4

[复制链接]

2万

积分

5

听众

863

音贝

音频应用初级会员

Rank: 6Rank: 6

积分
27608
发表于 2008-6-15 | |阅读模式
音频应用公众号资讯免费发布推广
开启 mAcceptThread 线程 蓝牙4% Z) j4 V( g: u# {& u  ~+ L
1 i  ~' W& h( W  c5 E# O

" x7 p. |7 |1 p: [! ~/ t$ N% _  ' c8 |( v- H2 {5 f, w
  开启 mAcceptThread 线程,由于样例程序是仅 2 人的聊天过程,故之前先检测 mConnectThread 和 mConnectedThread 是否运行,运行则先退出这些线程。
2 \. A+ h4 r1 J3 m6 Z, n& E( V* z( A, ?9 Q: u
  public synchronized void connect(BluetoothDevice device) :" G$ _9 u' W/ W0 i
! {1 d$ ~8 b% ]/ P2 y! S8 l
  取消 CONNECTING 和 CONNECTED 状态下的相关线程,然后运行新的 mConnectThread 线程。2 c8 P3 G' N6 ^: ^  k+ C

; O! @+ B; [- r9 A5 l7 w1 X, M  public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) :
) n4 e6 `: ?" }( P! \
. y$ ^( @; T1 {0 d0 q  开启一个 ConnectedThread 来管理对应的当前连接。之前先取消任意现存的 mConnectThread 、 mConnectedThread 、 mAcceptThread 线程,然后开启新 mConnectedThread ,传入当前刚刚接受的 socket 连接。最后通过 Handler 来通知 UI 连接 OK 。: W: U" n5 w6 d
- e5 A9 B  M7 M) N4 o' b  h) X. u
  public synchronized void stop() :5 v; S8 t! t* b3 Q6 t

0 H: D4 a, g5 g" J  停止所有相关线程,设当前状态为 NONE 。2 @8 E$ P' O8 e1 U6 w3 S! C) n8 d/ `
9 z+ M, J7 p* @: _4 Z
  public void write(byte〔〕 out) :7 X1 M9 e- }3 x2 Y- h0 e$ z+ b

1 M9 b  Z" I( S) k. |  在 STATE_CONNECTED 状态下,调用 mConnectedThread 里的 write 方法,写入 byte 。# g" G9 [7 _1 w8 G3 a) H
( N# o( d! {7 b
  private void connectionFailed() :- y! E8 S6 E" d- E2 j3 T1 x- ]

' m. T% w9 W6 c( q0 a0 F  连接失败的时候处理,通知 ui ,并设为 STATE_LISTEN 状态。
: l; d9 i& ^# ?' ^3 _2 O9 ~& }) `' E; c" G
  private void connectionLost() :: J7 v$ M; s1 ^# d* L6 _: S0 `

. F; s- q9 }. b- q6 c  当连接失去的时候,设为 STATE_LISTEN 状态并通知 ui 。
- R$ F4 s( o0 Q& \+ l3 A8 p" O, M- M: B
  内部类:
& z2 g- U% G* p4 W; k" ^: k6 I" U! u% d% @" ~1 j2 [/ G
  private class AcceptThread extends Thread :0 J( `* q( f' {2 B8 }
4 j% h% ~! Z' `) q5 y6 m
  创建监听线程,准备接受新连接。使用阻塞方式,调用 BluetoothServerSocket.accept() 。提供 cancel 方法关闭 socket 。( a" [1 O. N: X$ U% D) ]1 m2 d

+ c9 \$ Z1 D) y- Q  private class ConnectThread extends Thread :
, X! [1 [$ n' W7 X5 k/ _9 u8 X& x! D+ G4 `; B$ a/ B
  这是定义的连接线程,专门用来对外发出连接对方蓝牙的请求和处理流程。构造函数里通过 BluetoothDevice.createRfcommSocketToServiceRecord() ,从待连接的 device 产生 BluetoothSocket. 然后在 run 方法中 connect ,成功后调用 BluetoothChatSevice 的 connected() 方法。定义 cancel() 在关闭线程时能够关闭相关 socket 。2 m4 [; z3 U) O
. I- D6 y7 T* A0 W' n1 H
  private class ConnectedThread extends Thread :' {# m8 i1 t5 b7 C* Q

/ g- G( a5 m/ p* ]: s  这个是双方蓝牙连接后一直运行的线程。构造函数中设置输入输出流。 Run 方法中使用阻塞模式的 InputStream.read() 循环读取输入流, 然后 post 到 UI 线程中更新聊天消息。也提供了 write() 将聊天消息写入输出流传输至对方,传输成功后回写入 UI 线程。最后 cancel() 关闭连接的 socket 。2 l9 [) F& P8 o( K
* ^. W. d" F% R- f6 j' G# z, T
  3.4. DeviceListActivity.java) U9 L+ `4 ]3 z9 n8 }9 k

9 o6 ~' o$ r0 I) I1 D2 {  该类包含 UI 和操作的 Activity 类,作用是得到系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。7 ~' F8 F, E. E# F; `) f3 F
7 z  P/ E$ H7 C2 k( P0 I5 k
  除了 RFCOMM 通信外, Android 上关于 Bluetooth 的还有 SDP 、 GAP 、耳机设备连接等内容,本文还未涉及,将会随着蓝牙相关 API 在新版本中的进一步完善来学习使用。
欢迎厂家入驻,推文!免费!微信:yinpinyingyong
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

音频应用搜索

小黑屋|手机版|音频应用官网微博|音频招标|音频应用 (鄂ICP备16002437号)

Powered by Audio app

快速回复 返回顶部 返回列表