音频应用

 找回密码
 快速注册

QQ登录

只需一步,快速开始

阅读: 28406|回复: 0

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

[复制链接]

2万

积分

5

听众

863

音贝

音频应用初级会员

Rank: 6Rank: 6

积分
27608
发表于 2008-6-15 | |阅读模式
音频应用公众号资讯免费发布推广
开启 mAcceptThread 线程 蓝牙4
9 G3 ]7 D% V( @8 e4 h# K
8 |- I5 f. P7 j. e, M9 c" A5 W( }& S' |- m! o
  9 J4 q3 j4 i( U/ R2 L8 C
  开启 mAcceptThread 线程,由于样例程序是仅 2 人的聊天过程,故之前先检测 mConnectThread 和 mConnectedThread 是否运行,运行则先退出这些线程。
- l+ G5 S+ j1 e1 l, q' z, C
/ Y& k1 T, B' K+ L+ s  public synchronized void connect(BluetoothDevice device) :$ G% x$ A: s* g

, I3 ]  a# ^( `) M( ~  取消 CONNECTING 和 CONNECTED 状态下的相关线程,然后运行新的 mConnectThread 线程。4 o( e" F: \& O0 a! L- C
. T& v- ^' b6 R+ j' j: s6 ^9 d
  public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) :# `5 |, o% r! ?
/ Z& }- h5 z# S& H. z9 a+ b' O  Y
  开启一个 ConnectedThread 来管理对应的当前连接。之前先取消任意现存的 mConnectThread 、 mConnectedThread 、 mAcceptThread 线程,然后开启新 mConnectedThread ,传入当前刚刚接受的 socket 连接。最后通过 Handler 来通知 UI 连接 OK 。
1 {" h; P# k& T" L$ U0 l% T' o8 l# O# y% g/ @
  public synchronized void stop() :; W9 X! a4 L( P  h0 \9 Z, R7 |

2 }4 o7 E! E0 f2 n6 a0 f  停止所有相关线程,设当前状态为 NONE 。; s. {- y4 z$ S9 Y' p' }

! S( K$ o3 j0 T2 s" a  public void write(byte〔〕 out) :  U, i: R5 x5 r# G( k+ L

+ |& J# H7 c. g. H  在 STATE_CONNECTED 状态下,调用 mConnectedThread 里的 write 方法,写入 byte 。
6 h& b4 x+ o0 c; D( R" J
: n( B+ }) H' C9 J  private void connectionFailed() :9 s& o0 E  {  ~$ r# X
  {9 T' Z3 M! H1 K* P
  连接失败的时候处理,通知 ui ,并设为 STATE_LISTEN 状态。" H; b. m! C5 C& T: I
" f# c, I- C, Q2 f7 ~0 J0 \( a
  private void connectionLost() :
3 q; A) r* E( k0 T) w2 C* f0 F! u2 h, \( Z1 X
  当连接失去的时候,设为 STATE_LISTEN 状态并通知 ui 。7 l8 ~* u" a5 @+ b" e& M3 V7 i
, k# S: m  M" y* L$ r% e
  内部类:: [; Z0 _1 C* D2 R0 R; G! W" z0 B

# e+ o* A7 f! Y( x9 g% E3 n, J* V  private class AcceptThread extends Thread :; ]8 Q) v$ C) [

# x" w4 c$ n- g" e- S  创建监听线程,准备接受新连接。使用阻塞方式,调用 BluetoothServerSocket.accept() 。提供 cancel 方法关闭 socket 。" W# ^" W/ n5 _; f/ s

2 S- ~4 G1 }" k* ?% K  private class ConnectThread extends Thread :
( s+ c  O; Q6 r, h7 H2 o( n! i# p8 _1 u. o
  这是定义的连接线程,专门用来对外发出连接对方蓝牙的请求和处理流程。构造函数里通过 BluetoothDevice.createRfcommSocketToServiceRecord() ,从待连接的 device 产生 BluetoothSocket. 然后在 run 方法中 connect ,成功后调用 BluetoothChatSevice 的 connected() 方法。定义 cancel() 在关闭线程时能够关闭相关 socket 。7 y2 Z  `& [" C/ Y$ {% w6 p

; R9 Z; o" R, s; H/ A5 p  private class ConnectedThread extends Thread :1 m/ J7 ]0 ^; _$ Q& L4 R5 o

: ?" _4 y# _4 K" W/ j, ~+ d  这个是双方蓝牙连接后一直运行的线程。构造函数中设置输入输出流。 Run 方法中使用阻塞模式的 InputStream.read() 循环读取输入流, 然后 post 到 UI 线程中更新聊天消息。也提供了 write() 将聊天消息写入输出流传输至对方,传输成功后回写入 UI 线程。最后 cancel() 关闭连接的 socket 。- N1 `* A( L  @6 m6 g5 `2 w: C9 B) d9 D

5 [" m. L+ M+ ]' I$ b  3.4. DeviceListActivity.java, F: [* n! g4 q( h
6 k. ^2 c8 k6 D, o; |4 s" i2 l' d
  该类包含 UI 和操作的 Activity 类,作用是得到系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。
) H4 n. _8 |( h3 r8 c8 P+ {) \1 `% C& C- Z7 ^. o/ D2 k
  除了 RFCOMM 通信外, Android 上关于 Bluetooth 的还有 SDP 、 GAP 、耳机设备连接等内容,本文还未涉及,将会随着蓝牙相关 API 在新版本中的进一步完善来学习使用。
欢迎厂家入驻,推文!免费!微信:yinpinyingyong
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

音频应用搜索

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

Powered by Audio app

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