Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как прервать getInputStream()? 
V
    Опции темы
cromm3
Дата 18.10.2006, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 22.3.2006

Репутация: нет
Всего: нет



Всем привет! 
Есть следующая функция:
Код

 InputStream is1 = null;
  URLConnection urlConn= null;
  private String readnetPost(String myUrl, String s) {
    URL myData = null;
    StringBuffer myBuf;
    String str;
    myBuf = new StringBuffer(myUrl);
    try {
      myData = new URL(myBuf.toString());
    }
    catch (MalformedURLException ml) {
      System.out.println("Error URL: syntax incorrect");
    }
    try {
      urlConn = myData.openConnection();
      urlConn.setDoInput(true);
      urlConn.setDoOutput(true);
      urlConn.setUseCaches(false);
      urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
      DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());
      out.writeBytes(s);
    }
    catch (IOException e) {
      System.out.println("Error opening a URL connection.");
    }
    int c;
    StringBuffer sBuf = new StringBuffer();
    try{
      is1 = urlConn.getInputStream();
      while ((c = is1.read())!=-1){
        sBuf.append((char)c);
      }
      is1.close();
    }
    catch (IOException e) {
      System.out.println("Error reading URL data.");
    }
    str = sBuf.toString();
    return str;
  }

Как можно прервать запрос данных 
(is1 = urlConn.getInputStream();)? Что бы пользователь мог, скажем, по нажатию кнопки остановить процесс?
Спасибо!
PM   Вверх
JUncle
Дата 18.10.2006, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 6.4.2006
Где: Казань, РФ

Репутация: нет
Всего: 1



cromm3, по видимому как и с сокетами, закрыть поток методом close, и перехватить IOException (возможно, используя какой либо признак, чтобы не записывать сообщение об ошибке в лог либо не выводить на экран).
--------------------
class JUncle extends Man // singleton{/*...*/}
PM MAIL   Вверх
COVD
Дата 18.10.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Очевидно, вы хотите прервать операцию c = is1.read().  Читающий процесс блокируется в read(), если нет данных. В общем случае - НИКАК!

Можно попробовать is1.close() другим потоком. Но этот другой поток также может оказаться заблокированным - войдет в close() , да так там в недрах и останется в состоянии lock.  Здесь вам не сокеты smile.

Interrupt на читающем потоке тоже ничего недаст (впрочем как и запрещенный stop). 

Разблокировать можно с сервера послав данные или закрыв соединение. Но это не выход. А выход - оставить как есть - обьявить читающий поток мертвым через какой-либо флаг и начать все сначала, если надо. Заблокированный же поток будет висеть, пока не сработает таймаут сокета (если предусмотрен) или виртуальная машина не будет остановлена или что-то с сервера не придет.

Это сообщение отредактировал(а) COVD - 18.10.2006, 23:58
PM MAIL   Вверх
cromm3
Дата 18.10.2006, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 22.3.2006

Репутация: нет
Всего: нет



Пробовал is1.close() но это не останавливает поток, что мне показалось удивительным...
PM   Вверх
COVD
Дата 18.10.2006, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



В смысле, поток не блокируется в close()? Ну, а цель-то достигается? Читающий поток разблокируется?
PM MAIL   Вверх
cromm3
Дата 19.10.2006, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 22.3.2006

Репутация: нет
Всего: нет



Нет, цель не достигается, даже если сделать is1.close() в каком-то другом потоке, то функция все равно ждет когда исполнится urlConn.getInputStream() и потом продолжает работать дальше, причем корректно получив все данные с сервера…
PM   Вверх
COVD
Дата 23.10.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



ну так я вам про то и говорил, что при использовании сановского URLConnection никак не разблокировать.  Посмотрите апачевский HttpClient http://jakarta.apache.org/commons/httpclient/. 
PM MAIL   Вверх
cromm3
Дата 24.10.2006, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 22.3.2006

Репутация: нет
Всего: нет



В общем, проблему решил сменой всего алгоритма работы с запросами… но все равно спасибо!
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0429 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.