接收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就是丢失第一个数据,第一个数据被上一次阻塞的线程抢去了。求大侠们指导下这个问题怎么解决

解决方案 »

  1.   

    mInputStream调用了close方法,为什么read()还会阻塞?LZ把完整的代码贴出来
      

  2.   

    其实完整代码也就这些了,只是源码是Android的,不知道兄弟有没有做过,贴上来吧。private byte[] buffs = new byte[68];
    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();
    }
      

  3.   

    //得到串口对象
        mApplication = Application.getApplication(this);
     android里有这个方法?这个应该是你自己定义的吧,也就是inputstream也是自己实现的,用的jni?可能是你底层写的close方法有bug,造成没有完全释放资源。