接收InputStream的时候,read()方法会进入阻塞,然后问题就出现了,我写了了个线程然后在
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
while (!isInterrupted()) {
//这里阻塞了
int b=mInputStream.read();
}
}
}然后我在退出程序的时候if (mReadThread != null){
//中断
mReadThread.interrupt();
mInputStream.close();
}
read()这个方法真霸道啊,阻塞了。然后我中断,再close掉,read()方法还在等待,然后我退出程序再次进入程序,new一个线程,然后运行这个线程,这时候问题了,由于有数据上来,上一次退出程序的时候,read()方法还在阻塞,首先抢了第一个数据,然后抛出异常,线程才真正停止,然后第二个线程才开始读数据,造成的BUG就是丢失第一个数据,第一个数据被上一次阻塞的线程抢去了。求大侠们指导下这个问题怎么解决
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
while (!isInterrupted()) {
//这里阻塞了
int b=mInputStream.read();
}
}
}然后我在退出程序的时候if (mReadThread != null){
//中断
mReadThread.interrupt();
mInputStream.close();
}
read()这个方法真霸道啊,阻塞了。然后我中断,再close掉,read()方法还在等待,然后我退出程序再次进入程序,new一个线程,然后运行这个线程,这时候问题了,由于有数据上来,上一次退出程序的时候,read()方法还在阻塞,首先抢了第一个数据,然后抛出异常,线程才真正停止,然后第二个线程才开始读数据,造成的BUG就是丢失第一个数据,第一个数据被上一次阻塞的线程抢去了。求大侠们指导下这个问题怎么解决
解决方案 »
- JAVA编程查询mysql数据库,查询条件是汉字时返回为空?
- 去掉文字,从小到大排列,等待高手!!!!!!!!
- 运行jar时提示 java.lang.NoClassDefFoundError: org/apache/logger
- 多个excel文件,合并成一个excel文件,要求是:原多个excel文件内容对应为生成的excel文件的其中一个工作簿
- 请高手指点
- SQL server与java的一个问题
- 达人请进!新手在线等!MyEclipse+jsp初级问题。。。。。。。
- 急救 小弟刚学程序 能给出俄罗斯方块的具体算法
- ie是否不支持swing
- 高分求助:请看下面代码出了什么问题,编译没问题,运行出错?
- 自定义异常类中传入Throwable类型和对象 String类型对象有什么区别
- mysql 过滤中英文开头的数据
private int i = 0;
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
while (!isInterrupted()) {
int b = -1;
try {
b = mInputStream.read();
buffs[i] = (byte) b;
i++;
//独到结束符或回车键返回数组
if (b == 13) {
// onDataReceived(buffs, buffs.length);
i = 0;
buffs = new byte[68];
}
} catch (IOException e) {
Log.w("IOException", "read() failed or interrupted...");
e.printStackTrace();
}
}
}
}
然后是启动程序的时候代码,这个可以说等同于java的main() @Override
protected void onCreate(Bundle savedInstanceState) {
//读取串口配置
if (serialPortPreferences == null) {
serialPortPreferences = SerialPortPreferences
.getSerialPortPreferences(this);
serialPortPreferences.initSerialPortPreferences();
}
//得到串口对象
mApplication = Application.getApplication(this);
try {
if (mSerialPort == null) {
mSerialPort = mApplication.getSerialPort();
//得到输入流
mInputStream = mSerialPort.getInputStream();
//得到输出流
mOutputStream = mSerialPort.getOutputStream();
mReadThread = new ReadThread();
mReadThread.start();
}
} catch (SecurityException e) {
DisplayError(error_security);
} catch (IOException e) {
DisplayError(error_unknown);
} catch (InvalidParameterException e) {
DisplayError(error_configuration);
}
super.onCreate(savedInstanceState);
}
然后是退出程序的代码@Override
protected void onDestroy() {
if (mReadThread != null)
mReadThread.interrupt();
mApplication.closeSerialPort();
mSerialPort = null;
try {
mInputStream.close();
mOutputStream.close();
mInputStream = null;
mOutputStream = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.onDestroy();
}
mApplication = Application.getApplication(this);
android里有这个方法?这个应该是你自己定义的吧,也就是inputstream也是自己实现的,用的jni?可能是你底层写的close方法有bug,造成没有完全释放资源。