音频应用

 找回密码
 快速注册

QQ登录

只需一步,快速开始

查看: 46779|回复: 0
收起左侧

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

[复制链接]

2万

积分

5

听众

818

音贝

音频应用初级会员

Rank: 6Rank: 6

积分
27383
发表于 2008-6-15 10:15:03 | 显示全部楼层 |阅读模式
开启 mAcceptThread 线程 蓝牙4# u1 L  r' K& u) U8 C9 ], a

3 u# x1 [3 i6 ^; d% Y0 d0 |
! e+ Z0 t* k4 i/ x  
) r$ j/ S1 o5 L* X9 B  开启 mAcceptThread 线程,由于样例程序是仅 2 人的聊天过程,故之前先检测 mConnectThread 和 mConnectedThread 是否运行,运行则先退出这些线程。2 u2 Q' a) J/ {9 P5 a

1 o7 `- z2 `2 U) v6 x  public synchronized void connect(BluetoothDevice device) :
  p; |+ i3 x( {6 R6 M% s* |: r
  Y4 L! ]+ a8 F) V) W  取消 CONNECTING 和 CONNECTED 状态下的相关线程,然后运行新的 mConnectThread 线程。5 ^- U# p- c3 G8 J- F/ X$ \
! X( D' u9 x- U/ I+ D# K5 M0 r
  public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) :# Z% G, c& Y( ~3 Q, R5 g! ]; l7 n

3 {& {+ p  R0 L" H7 H. S0 w% _$ N  开启一个 ConnectedThread 来管理对应的当前连接。之前先取消任意现存的 mConnectThread 、 mConnectedThread 、 mAcceptThread 线程,然后开启新 mConnectedThread ,传入当前刚刚接受的 socket 连接。最后通过 Handler 来通知 UI 连接 OK 。# T! C# A; E: Q$ m

' b% k- G8 |" h0 W. N  public synchronized void stop() :8 F7 f# v4 ^2 [' u! b8 c+ n
, H  M( v" u1 _
  停止所有相关线程,设当前状态为 NONE 。$ {' w  @' @/ C  u
  P/ [2 ?( U* p0 x
  public void write(byte〔〕 out) :
0 j3 y! o1 e, q0 P' v" i0 y/ O! ]. P- q
  在 STATE_CONNECTED 状态下,调用 mConnectedThread 里的 write 方法,写入 byte 。
; A  \( A; b# X6 I( c" J: z$ n. }+ p5 m9 |$ G" }& R
  private void connectionFailed() :& K5 T/ I1 l, N% r! w

. G* }! e$ k/ k+ h  连接失败的时候处理,通知 ui ,并设为 STATE_LISTEN 状态。
' \4 R8 C5 E8 t' D( J0 d. Z  f- e& S
  private void connectionLost() :
- B& D2 f) f8 Z+ [. |! \, D% w; U: Y$ f
  当连接失去的时候,设为 STATE_LISTEN 状态并通知 ui 。
% r0 \5 J* l! y, K
( V+ a0 D% Y- O0 K$ F  内部类:1 ~, p! [4 G! G* C! G

+ P# E/ o7 `! Y) W  n* M  private class AcceptThread extends Thread :
& g. \5 I9 O' p, C9 V' i, C
3 E' _( U5 E- A: N+ r; N/ @  创建监听线程,准备接受新连接。使用阻塞方式,调用 BluetoothServerSocket.accept() 。提供 cancel 方法关闭 socket 。
$ `4 f  K6 \; ]: z, c, o
9 v2 Q; g  I: M% v: l  private class ConnectThread extends Thread :) m. u- n: T2 v- t: G
, l) r/ W2 T" V6 ^
  这是定义的连接线程,专门用来对外发出连接对方蓝牙的请求和处理流程。构造函数里通过 BluetoothDevice.createRfcommSocketToServiceRecord() ,从待连接的 device 产生 BluetoothSocket. 然后在 run 方法中 connect ,成功后调用 BluetoothChatSevice 的 connected() 方法。定义 cancel() 在关闭线程时能够关闭相关 socket 。2 h% m% a* i3 H9 f3 B( {

/ A+ {! x8 M' R0 o( O  private class ConnectedThread extends Thread :7 |: a5 x2 Y  e, s
5 R. h' v' L$ y( b- k
  这个是双方蓝牙连接后一直运行的线程。构造函数中设置输入输出流。 Run 方法中使用阻塞模式的 InputStream.read() 循环读取输入流, 然后 post 到 UI 线程中更新聊天消息。也提供了 write() 将聊天消息写入输出流传输至对方,传输成功后回写入 UI 线程。最后 cancel() 关闭连接的 socket 。
5 }$ J  P- E3 w, i0 J, Q
  H9 D2 K1 \2 R  3.4. DeviceListActivity.java
" O6 O5 P# k. f) [8 R' V
; y3 X0 O8 C8 a: A" A; c  该类包含 UI 和操作的 Activity 类,作用是得到系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。& U( ]& u3 `+ n8 n

( q0 b2 g7 J+ z( F& V1 w- f  除了 RFCOMM 通信外, Android 上关于 Bluetooth 的还有 SDP 、 GAP 、耳机设备连接等内容,本文还未涉及,将会随着蓝牙相关 API 在新版本中的进一步完善来学习使用。
欢迎厂家入驻,推文!免费!微信:yinpinyingyong
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

音频应用搜索

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

GMT+8, 2025-6-7 14:47 , Processed in 0.022002 second(s), 5 queries , Redis On.

Powered by Audio app

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