小弟利用抛出错误,退出带阻塞语句的子线程,以下是两个子线程,一个读蓝牙,一个读网络(TCP/IP),都是用
// 存储位置byte[] buffer = new byte[1024];
// 数据数量int bytes;
bytes = mmInStream.read(buffer);,但是网络的不抛出错误还请大侠指导,是不是自己鬼障眼了,死活没看出错误,下面上代码,两个子线程都在窗体的销毁事件里调用了cancel函数,但是一个可以抛出错误,关闭线程,一个不可以,请问为什么呢
先看看可以退出的蓝牙读取子线程的读取和退出private class ReadThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream; public ReadThread(BluetoothSocket socket) {
Log.d(TAG, "create ConnectedThread");
// 通过形参得到BluetoothSocket
mmSocket = socket;
InputStream tmpIn = null;
// OutputStream tmpOut = null;
setName("ReadThread");
try {
tmpIn = socket.getInputStream();
} catch (IOException e) {
Log.e(TAG, "temp sockets not created", e);
} mmInStream = tmpIn;
} public void run() {
Log.i(TAG, "BEGIN mConnectedThread");
// 存储位置
byte[] buffer = new byte[1024];
// 数据数量
int bytes; while (r_Read) {
try {
try {
ReadThread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 读取客户发送的信息,如果没有发送将被阻塞
bytes = mmInStream.read(buffer);
// 将数据发送至主线程消息堆
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
// 为修改标志位提供等待时间
try {
ReadThread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
Log.e(TAG, "disconnected_Read", e);
// 启动丢失过程
break;
}
}
}         public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "close() of connect socket failed", e);
}
}
}
用下面代码启动                        r_Read = true;
if (mReadThread == null) {
mReadThread = new ReadThread(mClientSocket);
mReadThread.setName("mRead");
mReadThread.start();
}下面是TCP/IP的读取,死活不抛出错误
private class ReadGPRS extends Thread {

private final Socket mIPSocket;
private final InputStream mIPStream; public ReadGPRS(Socket socket) {
Log.d(TAG, "create ConnectedThread");
// 通过形参得到BluetoothSocket
mIPSocket = socket;
InputStream tmpIn = null;
// OutputStream tmpOut = null;
setName("ReadGPRS");
try {
tmpIn = mIPSocket.getInputStream();
} catch (IOException e) {
Log.e(TAG, "temp sockets not created", e);
} mIPStream = tmpIn;
// mipRBuffer = new BufferedReader(new InputStreamReader(mIPStream));
}


@Override
public void run() {

// 存储位置
byte[] buffer = new byte[1024];
// 数据数量
int bytes;

while (r_IPRead) {
try {
try {
ReadThread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 读取客户发送的信息,如果没有发送将被阻塞
bytes = mIPStream.read(buffer); mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget();

try {
ReadThread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
Log.e(TAG, "disconnected_IP", e);
// 启动丢失过程
break;
}
}
}

        public void cancel() {
try {
mIPSocket.close();
} catch (IOException e) {
Log.e(TAG, "close() of connect socket failed", e);
}
}

}
下面是启动代码                                if (mGprs==null) {
r_IPRead=true;
mGprs= new ReadGPRS(ipsSocket); 
// mGprs.setDaemon(true);
mGprs.start();
}