2016-09-28 6 views
1

Я использую FileInputStream в потоке в Android java для чтения из файла последовательного интерфейса. stream.read (buffer), если нет данных, ожидающих прямо сейчас, если новые данные поступают снова, продолжается. Данные поступают время от времени, всякий раз, когда что-то приходит в поток, продолжает работать. Отлично!Android close FileInputStream

Но когда я хочу прекратить нить, кажется, я наткнулся на давно известную ошибку. thread.interrupt() не отменяет stream.read().
В этом вопросе есть много вопросов. Единственное, что должно работать, это закрыть базовый поток. Но если я закрою свой FileInputStream stream.read() в моем потоке приемника, все равно ждут. Он останавливается только после получения следующей группы данных - это, конечно, происходит неправильно.

Что еще я могу сделать, чтобы действительно закрыть или выключить FileInputStream?

Редактировать
После обсуждения моего решения выглядит так. Это не лучшая производительность и использование доступных(), которые не рекомендуется в документах, но это работает.

Нить, прислушивается к файлу:

byte[] buffer = new byte[1024]; 
while (!isInterrupted()) 
{ 
    if (stream.available() == 0) 
    { 
    Thread.sleep(200); 
    continue; 
    } 

    // now read only executes if there is something to read, it will not block indefinitely. 
    // let's hope available() always returns > 0 if there is something to read. 
    int size = stream.read(buffer); 

    now do whatever you want with buffer, then repeat the while loop 
} 

Продолжительность сна является компромиссом между не зацикливанием всего времени и получать данные в приемлемом интервале. Mainthread завершает это с

stream.close(); // which has no effect to the thread but is clean 
thread.interrupt(); 
+0

Вы можете разместить этот блок кода? – user1506104

+0

Тема: 'while (! IsInterrupted()) { int size = inputStream.read (buffer); . , , буфер процесса } ' Основная нить: inputStream.close(); – Droidum

+0

'read' имеет IOException. вы захватили это? предоставить больше информации, указав больше вашего исходного кода. – user1506104

ответ

1

Я предполагаю, что нет ничего, что вы можете сделать с этим блокирующим read операции. Попробуйте available, чтобы проверить, есть ли данные перед чтением.

while(!isInterrupted()) { 
    int len = 0; 
    if(len = inputStream.available() > 0) 
    // read your data 
} 

Вот еще один вариант: How to stop a thread waiting in a blocking read operation in Java?

+1

Хорошо спасибо за подтверждение моего страха, по крайней мере, я могу остановить поиск :-) Я проверяю наличие доступных() в цикле со сном. Доступный() документирован как ненадежный, а ожидание - тоже не очень хорошо. Но, видимо, другого пути нет. – Droidum

+0

, как только вы придумаете лучшее решение, отправьте его здесь. Мне интересно знать решение. ти. – user1506104

+0

так и я, см. Оригинальное сообщение – Droidum

Смежные вопросы