java.io.IOException: read failed, socket might closed or timeout, read ret: -1

近期项目中连接蓝牙之后接收蓝牙设备发出的指令功能,在连接设备之后,创建RfcommSocket连接时候报java.io.IOException: read failed, socket might closed or timeout, read ret: -1错误。以下说一下我的解决方法,希望对各位有一点帮助。

private BluetoothSocket mSocket;
<span style="white-space:pre">	</span>private InputStream mInputSream;
<span style="white-space:pre">	</span>private UUID mUUID = UUID
<span style="white-space:pre">			</span>.fromString("00001101-0000-1000-8000-00805F9B34FB");
//找到蓝牙设备并推断是否连接上蓝牙,并创建socket
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
		Set<BluetoothDevice> sets = adapter.getBondedDevices();
		Iterator<BluetoothDevice> iterator = sets.iterator();
		while (iterator.hasNext()) {
			BluetoothDevice device = iterator.next();
			if (mUtils.isConnected(device))
				try {
					mBluetoothDevice = device;
					mSocket = mBluetoothDevice
							.createRfcommSocketToServiceRecord(mUUID);


接下来就是socket的连接了,本来我是在一个子线程中做的这些:

public void run() {
		
				try {
					if (mSocket != null)
						mSocket.connect();
					if (mSocket != null) {
						mInputSream = mSocket.getInputStream();
						mIsRunning = true;
					}
					while (mIsRunning) {
						byte[] buffer = new byte[16];
						while (mInputSream != null
								&& mInputSream.read(buffer) > 0 && mIsRunning) {
							String val = new String(buffer);
							Log.i("SPP", val);
							Intent intent = new Intent();
							if (val.contains("+PTT=P")) {
								intent.setAction("android.intent.action.PTT.down");
							} else if (val.contains("+PTT=R")) {
								intent.setAction("android.intent.action.PTT.up");
							}
							mContext.sendBroadcast(intent);
							Arrays.fill(buffer, (byte) 0);
						}
					}

				} catch (IOException e) {
					try {
						if (mInputSream != null)
							mInputSream.close();
						if (mSocket != null) {
							mSocket.close();
							mSocket = null;
						}
					} catch (Exception e2) {
						// TODO: handle exception
					}
				}
		
	}
可是这样在socket连接的时候还是会报java.io.IOException: read failed, socket might closed or timeout, read ret: -1错误,

查了各种资料也没找到解决方法。<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">经过自己多次实验发如今</span>
mSocket.connect()时候还须要在还有一个子线程中处理才正常连接上接收到指令。也就是例如以下代码:
<pre name="code" class="java">public void run() {
		new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					if (mSocket != null)
						mSocket.connect();
					if (mSocket != null) {
						mInputSream = mSocket.getInputStream();
						mIsRunning = true;
					}
					while (mIsRunning) {
						byte[] buffer = new byte[16];
						while (mInputSream != null
								&& mInputSream.read(buffer) > 0 && mIsRunning) {
							String val = new String(buffer);
							Log.i("SPP", val);
							Intent intent = new Intent();
							if (val.contains("+PTT=P")) {
								intent.setAction("android.intent.action.PTT.down");
							} else if (val.contains("+PTT=R")) {
								intent.setAction("android.intent.action.PTT.up");
							}
							mContext.sendBroadcast(intent);
							Arrays.fill(buffer, (byte) 0);
						}
					}

				} catch (IOException e) {
					try {
						if (mInputSream != null)
							mInputSream.close();
						if (mSocket != null) {
							mSocket.close();
							mSocket = null;
						}
					} catch (Exception e2) {
						// TODO: handle exception
					}
				}
			}
		}).start();
	}

这里仅仅是找到了解决方法,可是还不知道原因,也查了各种资料,没有得到为什么在子线程中做,connect的时候还须要再开一个子线程。




原文地址:https://www.cnblogs.com/yangykaifa/p/7147625.html