Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.174.95] |
|
Сообщ.
#1
,
|
|
|
Всем привет! Опять я:)
Не знаю, на сколько это перспективная тема, но попробую озвучить вопрос. Все то же приложение для заказа такси. Сейчас работаю над стартовой деятельностью, задачей которой является выполнение авторизации на сервере. В случае успеха открывается форма заказа, в случае, если сервер говорит нопасаран, должна открываться форма для регистрации (возможна перерегистрация). В случае же сетевого недоразумения появляется AlertDialog, который предлагает попробовать соединиться еще раз, либо выйти из программы. Сегодня долго гонял эту стартовую форму и этот самый диалог. Проблема в том, что если за первую же попытку соединение не состоялось (выдергивал сетевой кабель из ноута, интернет на телефон раздаю с ноута по WiFi), то потом, когда я кабедь втыкаю, сетевые соединения в Windows воскресаю, моей программе на смартфоне все никак не удается подключиться. Везло очень редкие разы, а несколько раз так и не дождался, когда счастье соединиться с сервером привалит - все скачет этот диалог, предлагающий повторить. При этом пробовал параллельно ходить в интернет другими программами - браузером, GMail, YouTube, у них все ок. Что-то сразу не догадался вывести реальное сообщение об ошибке. Когда сделал, оказалось Connection reset by peer. Вот кусок кода, отвечающий за обмен с сервером: new Thread(new Runnable() { public void run() { try { // Откроем страницу для отправки данных URL url = new URL("http://бла-бла-бла.php"); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); // устанавливаем метод POST conn.setRequestMethod("POST"); // запрещаем кэширование conn.setUseCaches(false); // полудуплексный режим обмена conn.setDoOutput(true); conn.setDoInput(true); conn.setConnectTimeout(30000); // Зададим разделитель conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundry); conn.setRequestProperty("Content-Length", String.valueOf(requestBody.toString().length())); // Send the body DataOutputStream dataOS = new DataOutputStream(conn.getOutputStream()); dataOS.writeBytes(requestBody.toString()); dataOS.flush(); dataOS.close(); // Получим код ответа if (conn.getResponseCode() == 200) { // Прочитаем ответ сервера BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), "windows-1251")); String line; final StringBuffer buf = new StringBuffer(); while ((line = rd.readLine()) != null) { buf.append(line + "\r\n"); } // Вызовем обрабочик в дочернем классе onSuccess(buf.toString().trim()); } else { onError(""); } } catch (Exception e) { onError(e.getMessage()); } } }).start(); Как это вылечить? Добавлено P.S. Тело запроса как StringBuffer requestBody формируется до этого, во всех поптыках очевидно правильное (проверял, выводя его в этом же сообщении), разницы между для первого и последующих запросов в нем нет никакой. Если изначально сеть есть, то подключается без проблем. Но! Несколько раз та же ошибка выводилась, когда я нажимал Отмена в диалоге, приложение закрывалось, я его запускал тут же снова. Прочухалось только после того, как я через приложение YouTube открыл новый ролик. Чем YouTube круче? |
Сообщ.
#2
,
|
|
|
имхо, может проблема в том, что не сделан disconnect в обязательном порядке, даже после ошибки?
URL url = new URL("http://www.android.com/"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); try { InputStream in = new BufferedInputStream(urlConnection.getInputStream()); readStream(in); finally { urlConnection.disconnect(); } } Добавлено поток у Вас крутиться постоянно или перезапускается? |
Сообщ.
#3
,
|
|
|
Цитата micro @ Ну Вы же видите код: new Thread(...).start(). Создаваемый поток просто не может быть повторно использован.поток у Вас крутиться постоянно или перезапускается? Насчет disconnect() подумаю, но не уверен, что решит проблему. Добавлено Попробовал disconnect(). Ничего не изменилось. Но лучше все-таки такую инструкцию иметь, а то получается, что у меня ни одно соединение не закрывается. Где-то, наверно, на StackOverflow видел похожую тему, но, к сожалению, закрыл ее после ознакомления и не сохранил ссылку. Попробую через журнал поискать. Там тоже говорилось о подобной проблеме с интернет по WiFI и озвучивалось, что иногда для такого интернета требуется что-то вроде sign in, что может быть выполнено в браузере, поэтому рекомендовалось вывести соответствующее сообщение пользователю, чтобы он сам "разморозил" интернет, открыв какую-нибудь страницу в браузере. Перед этим делается проверка - если доменное имя получается при соединении не такое, какое мы запрашиваем, значит, произошел редирект, имеем именно такую ситуацию. |
Сообщ.
#4
,
|
|
|
http://www.sql.ru/forum/actualthread.aspx?tid=284608
Добавлено По коду я увидел, что у Вас создается новый поток и сразу запускается. Просто было не понятно, в каком контексте все работает. Придумал себе, что всегда создается новый, пока не будет достигнута авторизация. |
Сообщ.
#5
,
|
|
|
К чему это? Совсем из другой оперы. |
Сообщ.
#6
,
|
|
|
сам не знаю , моё ведь дело подсказать, а не решить вопрос ).
Речь была не об этой статье на stackoverflow? stackoverflow |
Сообщ.
#7
,
|
|
|
Цитата micro @ Речь была не об этой статье на stackoverflow? Нет, не об этой. Что-то мне так и не удалось найти то, что видел вот ночью:( Весь журнал FF облазил, все что-то не то. Но возможно, я видел ту заметку и на другом ресурсе. |
Сообщ.
#8
,
|
|
|
запость пожалуйста дамп exception-a , мне просто сложно въехать, как работаешь с потоком.
Добавлено This error indicates that the remote side has closed the connection while your side was still trying to read from it. You should check if there is a problem on the server (check it's logs) or you are trying to read more data than the server supplies |
Сообщ.
#9
,
|
|
|
А что тут въезжать? Все же по коду ясно. Поток создается с помощью Runnable и тут же запускается. Никаких ссылок на него не куда не передается, код я привел полный. onSuccess() и onError() - это методы из дочернего класса, в которых определены действия в случае успеха или ошибки соединения и обмена данными. Никаких действий с потоком в них не производится.
Дамп сейчас попробую сделать. Добавлено Э, а как я его тебе сделаю? У меня exception ловится. А сейчас вот попробовал, с второй или третьей где-то попытки соединение прошло. Не знаю, почему так, я только добавил disconnect(). |