Java 使用enableReceiveTimeout后读取流

Java 使用enableReceiveTimeout后读取流,java,gps,readline,Java,Gps,Readline,我目前正在从事一个Java项目,其目标之一是在地图上显示用户的当前位置。代码完成后,我意识到用户有可能在应用程序仍在运行时拔下GPS设备。在重新创建上述场景时,我发现应用程序永远挂起在代码处: detectedGPSPortBufferReader.readLine(); 因此,我访问了好的旧Java文档,找到了方法enableReceiveTimeout(),一切都很完美。(值为30000,30秒) 现在,我设法想出了另一个场景,用户可以重新插入设备。在这种情况下,我的客户希望设备重新开始阅

我目前正在从事一个Java项目,其目标之一是在地图上显示用户的当前位置。代码完成后,我意识到用户有可能在应用程序仍在运行时拔下GPS设备。在重新创建上述场景时,我发现应用程序永远挂起在代码处:

detectedGPSPortBufferReader.readLine();
因此,我访问了好的旧Java文档,找到了方法enableReceiveTimeout(),一切都很完美。(值为30000,30秒)

现在,我设法想出了另一个场景,用户可以重新插入设备。在这种情况下,我的客户希望设备重新开始阅读。但不幸的是,这并没有发生

我和我的好友“老爪哇文档”一起工作,我希望你们中的任何一位极客神能指引我的旅程

我的代码:

try {
    myGPSConnector.detectedGPSPort.enableReceiveTimeout(3000);

    if(myGPSConnector.detectedGPSPortBufferReader.readLine() != null)
    {   
        myGPSConnector.nmeaResponse = myGPSConnector.detectedGPSPortBufferReader.readLine();
        System.out.println(myGPSConnector.nmeaResponse);
    }
}
catch (Exception e)
{
    locationString = "GPS Device not detected.";
}
@derrabink:它可以是另一个流,因为我尝试使用以下代码扩展:

try {
    myGPSConnector.detectedGPSPort.enableReceiveTimeout(3000);

    if(myGPSConnector.detectedGPSPortBufferReader.readLine() != null)
    {   
        myGPSConnector.nmeaResponse = myGPSConnector.detectedGPSPortBufferReader.readLine();
        System.out.println(defaultGPSConnector.nmeaResponse);
    }
}
catch (Exception e) 
{
    locationString = "GPS Device not detected.";

    try {
        defaultGPSConnector.detectedGPSPort.enableReceiveTimeout(30);
        } 
        catch (UnsupportedCommOperationException e1) 
        {
            System.out.println("UnsupportedCommOperationException");
                        }

    try {
            locationString = defaultGPSConnector.detectedGPSPortBufferReader.readLine();
        }
    catch (IOException e1) 
        {
            System.out.println("IOException ");
        }

它总是打印IOException

如果
,我会更改您的
if
作为
while
语句:

while ( myGPSConnector.detectedGPSPortBufferReader.readLine() == null ) {
    // don't do anything. Will stay here until the client decides to plug it again.
}

myGPSConnector.nmeaResponse = myGPSConnector.detectedGPSPortBufferReader.readLine();
System.out.println(myGPSConnector.nmeaResponse);
编辑

所以,你有一个30秒的循环,如果没有,如果在这段时间里没有什么可读的,这意味着这个家伙有比玩GPS更好的事情要做


这是我的方法。注意,可能不起作用。

我会更改您的
if
,以获得
while
声明:

while ( myGPSConnector.detectedGPSPortBufferReader.readLine() == null ) {
    // don't do anything. Will stay here until the client decides to plug it again.
}

myGPSConnector.nmeaResponse = myGPSConnector.detectedGPSPortBufferReader.readLine();
System.out.println(myGPSConnector.nmeaResponse);
编辑

所以,你有一个30秒的循环,如果没有,如果在这段时间里没有什么可读的,这意味着这个家伙有比玩GPS更好的事情要做


这是我的方法。小心,可能不起作用。

重新连接后是否会出现不同的流?如果是这样,您可能希望每隔一段时间就开始探测重新连接的设备的流(直到成功),只要readLine()需要一点时间。另外,您确定您的两条readLine()语句的方式正确吗?在我看来,你正在做两次读取,只保留第二次读取的结果。效果非常好,我的主人……重新连接后会有不同的流吗?如果是这样,您可能希望每隔一段时间就开始探测重新连接的设备的流(直到成功),只要readLine()需要一点时间。另外,您确定您的两条readLine()语句的方式正确吗?在我看来,你做了两次阅读,只保留了第二次阅读的结果。效果非常好,陛下……这是一个非常好的主意,陛下。但你似乎忽视了我的客户不想重新使用该设备的情况。因此,基本上是这样的:拔出>>等待30秒>>如果在30秒内拔出=继续否则退出,那么他想在拔出-->30秒-->后再次开始阅读,而不是再次拔出?有可能,是的。但他也在30秒内下了决心。否则,应用程序将退出。请看一看,它可能会对您有所帮助。如果没有,请告诉我,我会因为他们的效率低下而惩罚他们。这不管用,大人……对不起。。但不得不说,这是个好主意,陛下。但你似乎忽视了我的客户不想重新使用该设备的情况。因此,基本上是这样的:拔出>>等待30秒>>如果在30秒内拔出=继续否则退出,那么他想在拔出-->30秒-->后再次开始阅读,而不是再次拔出?有可能,是的。但他也在30秒内下了决心。否则,应用程序将退出。请看一看,它可能会对您有所帮助。如果没有,请告诉我,我会因为他们的效率低下而惩罚他们。这不管用,大人……对不起。。但不得不说。