Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
1

Реализовать таймаут ожидания отклика от сервера во избежание краха приложения

14.08.2014, 04:50. Просмотров 1284. Ответов 9
Метки нет (Все метки)

Вообщем есть поток в котором выполняется вот такой кусок кода

Java
1
2
3
4
5
6
           try {
            Document document = Jsoup.connect(link)
                    .get();
            } catch (IOException e) {
            e.printStackTrace();
            }
если вдруг интернет соединение прерывается на секунду и в это время пользователь инициирует парсинг, то приложение крашится. Пытался сделать таймаут при помощи этого

Java
1
Document document = Jsoup.connect(link).timeout(10000).get();
но не получается поток завершает свою работу и приложение крашится уже совсем по другим причинам. Как собствено организовать этот таимаут. Чтоб приложение подождало 10сек например и если сети все еще нет то выкинуло че-нить. Пока в голову приходит толь какой-нить цикл в котором на протяжении 10 секунд проверяется есть ли сеть. Если сеть есть то выход из цикла и выполнение программы в штатном режиме, если нет то ченить другое. Но это на бред похоже больше, чем на решение)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2014, 04:50
Ответы с готовыми решениями:

Получение почты (Для операции истекло время ожидания отклика принимающего (РОР) сервера)
При получении почты в MS Outlook появляется вот это: Задача "хххх.х.ххх.хх"...

Таймаут ожидания
Помогите с кодом мой код тут...

Установить таймаут ожидания выполнения функции из DLL
Приветствую знатоков и интересующихся. Суть проблемы: Есть довольно...

Автоматический перезапуск приложения в случае краха
Как правильно реализовать или как избежать перезапуска собственной логикой...

Копирование файлов в отдельном потоке во избежание зависания приложения
При копировании файла программа полностью зависает. После завершения...

9
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,074
14.08.2014, 08:13 2
Аналогично писал тут тему, внятного ответа не дождался.
0
646kapeh064
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
14.08.2014, 10:15 3
Цитата Сообщение от KillAndEat Посмотреть сообщение
Пытался сделать таймаут при помощи этого но не получается поток завершает свою работу и приложение крашится уже совсем по другим причинам
Но ведь таймаут работает? Значит так и делай.
И разбирайся с тем, что за "другая причина" у тебя появляется. Данная проблема имеет явно решения, она не такая сложная.
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
14.08.2014, 21:22  [ТС] 4
646kapeh064, таймаут НЕ работает! Как я понимаю timeout(10000) значит что приложение должно пытаться законектиться в течение 10 сек. Если конекта нет то все выполняется дальше. У меня нет этих 10 секунд для конекта, поток просто продолжает свою работу. И приложение вылетает из за того что поток возвращает null в связи с тем, что коннекта нет.
0
646kapeh064
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
14.08.2014, 21:42 5
Цитата Сообщение от KillAndEat Посмотреть сообщение
У меня нет этих 10 секунд для конекта, поток просто продолжает свою работу
Значит плохая архитектура )

Простым решением будет, это "присоединится" к потоку, а если точнее, дождаться его завершения.
Если это просто Thread, то метод join
Если это AsyncTask, то это метод public final Result get (long timeout, TimeUnit unit)

Либо поставь while и проверяй какой-нибудь флаг окончания коннекта.

Кстати, ты где пытаешься подконнектится? Полный код можешь кинуть?
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
14.08.2014, 22:53  [ТС] 6
646kapeh064, loader у меня.

Цитата Сообщение от 646kapeh064 Посмотреть сообщение
Либо поставь while и проверяй какой-нибудь флаг окончания коннекта.
до этого я и сам додумался, просто очень смахивает на велосипед.

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

Java
1
Document document = Jsoup.connect(link).timeout(10000).get();
и пока складывается впечатление что она както не так работает. Буду исходники смотреть.
0
646kapeh064
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
14.08.2014, 23:31 7
KillAndEat, твоя строчка с коннектом и там где ты ожидаешь ответа, это разные потоки?
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
15.08.2014, 00:53  [ТС] 8
вот тут выполняется загрузка и парсинг странички

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class t5 extends AsyncTaskLoader<PageInfo> {
   
   
    @Override
    public PageInfo loadInBackground() {
 
try {
            Document document = Jsoup.connect(link)
                    .get();
            } catch (IOException e) {
            e.printStackTrace();
            }
 
        return obj;
    }
}
Тут получаем ответ от потока в методе onLoadFinished и делаем что то в этим ответом. Это разные потоки.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class r4 implements LoaderManager.LoaderCallbacks<PageInfo> {
 
 
    @Override
    public Loader<PageInfo> onCreateLoader(int id, Bundle args) {
        return null;
    }
 
    @Override
    public void onLoadFinished(Loader<PageInfo> loader, PageInfo data) {
 
    }
 
    @Override
    public void onLoaderReset(Loader<PageInfo> loader) {
 
    }
}
Добавлено через 11 минут
Кароч посоны зря я тут бучу поднял) Таймаут не работает только когда соединение полностью оборвано. В этом случае вылетает исключение. А если подключение просто оборвалось то все норм. Вроде так)
0
646kapeh064
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
15.08.2014, 17:43 9
Цитата Сообщение от KillAndEat Посмотреть сообщение
В этом случае вылетает исключение. А если подключение просто оборвалось то все норм
значит надо было вместо e.printStackTrace(); писать return null;
и уже получив результат, сначала сравнить его с null
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
15.08.2014, 23:03  [ТС] 10
646kapeh064, нет, в этом случае есть специальный метод, который предлагает пользователю попробовать загрузить страничку снова.
0
15.08.2014, 23:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2014, 23:03

заедает звук на компьютере: "Таймаут (30000 мс) ожидания для подключения службы 1256477202"
недавно купил новый системник помагите плиз заедает звук при прослушивания...

Как реализовать синхронизацию самовыделения сервера в одноранговой сети клиент-серверного приложения С#?
Имеется локальная сеть. При появлении клиента в ней, он должен проверить...

Создание клиент сервера (TCP): не поступило отклика или компьютер отверг подключение
делаю так (сервер ) : Dim tcpListener As New TcpListener(Me._Port) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru