У меня возникло странное поведение сокетов. Я установил тайм-аут в 5 секунд, используя setSoTimeout. Это должно быть много времени в моей ситуации. Согласно онлайн-документации по java, необходимо выкинуть SocketTimeoutException
, если он истечет. В нем также говорится, что сокет по-прежнему действителен. Поэтому я хочу поймать его, а затем продолжить. Однако вместо внутреннего улова внешний catch IOException
улавливает искупление, и когда я вывожу в журнал данные, он говорит, что это SocketTimeoutException
. Еще одно недоумение заключается в том, что я изменяю тайм-аут с 5 секунд, чтобы сказать, 15 секунд, и запишите количество времени, которое требуется для каждого чтения, времена всегда находятся в миллисекундах, никогда даже не приближаясь к секунде. Любые идеи ВЕЛИКОЕ оценили.Android - время разгона
ReadThread
фрагмент кода
@Override
public void run()
{
try
{
while (true)
{
byte[] sizeBuffer = new byte[BYTES_FOR_MESSAGE_SIZE];
int bytesRead = this.inputStream.read(sizeBuffer);
int length = 0;
for (int i = 0; i < BYTES_FOR_MESSAGE_SIZE; i++)
{
int bitsToShift = 8 * i;
int current = ((sizeBuffer[i] & 0xff) << bitsToShift);
length = length | current;
}
byte[] messageBuffer = new byte[length];
this.socket.setSoTimeout(5000); //5 second timeout
try
{
this.inputStream.read(messageBuffer);
}
catch(java.net.SocketTimeoutException ste)
{
Log.e(this.toString(), "---- SocketTimeoutException caught ----");
Log.e(this.toString(), ste.toString());
}
}
}
catch (IOException ioe)
{
Log.e(this.toString(), "IOException caught in ReadThread");
Log.e(this.toString(), ioe.toString());
ioe.printStackTrace();
}
catch (Exception e)
{
Log.e(this.toString(), "Exception caught in ReadThread");
Log.e(this.toString(), e.toString());
e.printStackTrace();
}
this.interfaceSocket.socketClosed();
}// end run