音频应用

 找回密码
 快速注册

QQ登录

只需一步,快速开始

阅读: 27863|回复: 0

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

[复制链接]

2万

积分

5

听众

863

音贝

音频应用初级会员

Rank: 6Rank: 6

积分
27608
发表于 2008-6-15 | |阅读模式
音频应用公众号资讯免费发布推广
开启 mAcceptThread 线程 蓝牙4
* y) y0 |2 ?9 E& S
+ {6 M0 b& l2 v  ]8 b5 R+ F- d5 }% L5 g: L. |
  
3 d7 S) w4 `# M2 v+ L3 U& P3 V8 r  开启 mAcceptThread 线程,由于样例程序是仅 2 人的聊天过程,故之前先检测 mConnectThread 和 mConnectedThread 是否运行,运行则先退出这些线程。! z7 R! o) G" P) ^4 _
: m* g  {. j! r9 |7 j7 H3 n, C; B% \
  public synchronized void connect(BluetoothDevice device) :
# N- N, ]& l. K) b1 h% A$ x+ E: q* w, ]) X1 b- z
  取消 CONNECTING 和 CONNECTED 状态下的相关线程,然后运行新的 mConnectThread 线程。5 @! U# X1 g9 i+ |9 T3 p
& A$ z! v, `+ {% U
  public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) :3 q- _% [" w2 }  }% T# `
, C8 D, t0 g. s( ?& D* k0 C3 j+ c
  开启一个 ConnectedThread 来管理对应的当前连接。之前先取消任意现存的 mConnectThread 、 mConnectedThread 、 mAcceptThread 线程,然后开启新 mConnectedThread ,传入当前刚刚接受的 socket 连接。最后通过 Handler 来通知 UI 连接 OK 。
0 r/ A- n# ^. G4 Q; v& M) c
" g# i# V. }  L6 A3 b( V  public synchronized void stop() :
6 V0 o7 H  h, Q$ j) q
% g7 J& Y4 i$ i  停止所有相关线程,设当前状态为 NONE 。; y6 |  Q  l. \% ]/ p2 H

$ G1 Z: ^7 m4 n3 Z9 V+ P  public void write(byte〔〕 out) :
) O7 C5 O/ E8 f+ M$ _6 V3 `, e% Y
, D, H1 n  l1 `! [' z) t/ N/ B, T  在 STATE_CONNECTED 状态下,调用 mConnectedThread 里的 write 方法,写入 byte 。4 u# u# p& v- \2 B

7 M' Z, B) g, Q' W7 Z8 j  private void connectionFailed() :
3 I+ }) Q2 |( ?0 U# O) G4 }& p/ D3 S; d
  连接失败的时候处理,通知 ui ,并设为 STATE_LISTEN 状态。
" \2 a- \4 U- [, W$ q& C% _% o
5 Y7 W5 H4 d3 I  private void connectionLost() :
4 R: O+ M, D9 q: \
* O9 p  O) ?! @  D- l0 t  当连接失去的时候,设为 STATE_LISTEN 状态并通知 ui 。0 x" Y9 B& _4 r8 |2 @

! [  Y; a8 A( I0 N5 Q* e  内部类:, N0 \2 y) o# ^  s- T
2 P* Y/ X8 ^/ W  a: K
  private class AcceptThread extends Thread :
% O' c8 u, u- l9 c& p8 ^% m; c0 l5 b! _0 v( y. Y! Z
  创建监听线程,准备接受新连接。使用阻塞方式,调用 BluetoothServerSocket.accept() 。提供 cancel 方法关闭 socket 。
% R& r/ M! ~7 u' p
- \8 R3 U9 ]+ U3 z$ F$ {, I  private class ConnectThread extends Thread :
7 k! s- s: }" S; C& `5 \
) z- E: K# q3 b+ D  这是定义的连接线程,专门用来对外发出连接对方蓝牙的请求和处理流程。构造函数里通过 BluetoothDevice.createRfcommSocketToServiceRecord() ,从待连接的 device 产生 BluetoothSocket. 然后在 run 方法中 connect ,成功后调用 BluetoothChatSevice 的 connected() 方法。定义 cancel() 在关闭线程时能够关闭相关 socket 。$ Z, n. f# ]+ w" f( v* V
2 X8 r, I* T2 t: n+ Y9 _% @: I8 l
  private class ConnectedThread extends Thread :* Q3 e  b" i1 w
9 g& ^3 d7 W  l" G4 N$ c9 d: F( d
  这个是双方蓝牙连接后一直运行的线程。构造函数中设置输入输出流。 Run 方法中使用阻塞模式的 InputStream.read() 循环读取输入流, 然后 post 到 UI 线程中更新聊天消息。也提供了 write() 将聊天消息写入输出流传输至对方,传输成功后回写入 UI 线程。最后 cancel() 关闭连接的 socket 。
, V2 I  s7 @( a" l0 V1 G# x! \
9 c& N9 D  U4 y( O/ R: H& S6 m; @  3.4. DeviceListActivity.java
# g. t. i  R4 K# B( G8 j  |: @
( @/ l5 y3 h! l/ ?, k  该类包含 UI 和操作的 Activity 类,作用是得到系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。
  L' G0 D- H4 g; d  J$ v% ~
* Y/ V0 _+ B% U  q2 d6 r( p* y  除了 RFCOMM 通信外, Android 上关于 Bluetooth 的还有 SDP 、 GAP 、耳机设备连接等内容,本文还未涉及,将会随着蓝牙相关 API 在新版本中的进一步完善来学习使用。
欢迎厂家入驻,推文!免费!微信:yinpinyingyong
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

音频应用搜索

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

Powered by Audio app

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