![]() |
|
Модераторы: javastic, AntonSaburov |
![]()
|
|
| QTrueFalse |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
Всем доброго времени суток.
Я второй день уже бьюсь над одним вопросом. Вобщем, у меня есть мидлет на LWUIT и есть сокет соединение(входящий и исходящий thread-ы из сдантартного sun-овского примера для работы с сокетами). Имеет место быть один не понятный мне глюк, который я никак не могу отследить. Так вот, если говорить конкретно, то, мне приходит сообщение с данными по сети, эти данные обрабатываются и добавляются в контейнер List. И пока они приходят медленно друг за другом - всё хорошо. А вот если выслать друг за другом быстра два таких сообщения с данными, то выдруг, откуда не возьмись, в inputStream входящего потока, появляется -1 (connectionClosed). Причём появляется она там циклично, до тех пор, пока соединение не разорвётся(да, я пробывал просто считывать единицу и игнорировать её - непрокатывает). Есстественно, сервер мне эту -1 не шлёт - она появляется там буквально "ниоткуда". С помощью дебагера я "выяснил", что такое случается, когда предыдущее сообщение ещё не обработано и не добавлено в лист, а в inputStream уже поступило следующее сообщение - типа как будто "неуспело" добавится первое, а уже подошло второе - вот тогда появляется -1 эта... Я схитрил и частично решил проблему тем, что "усыплял" (sleep(1000)) поток на секунду, какбы "давая время" добавится сообщению в лист. Но всё равно, время от времени выскакивает -1. Да и некрасиво это както. Подскажите пожалуйста, в чём может быть проблема и куда можно "покопать"? Стоит сказать, что есть такое же приложение, но со стандартными элементами(без LWUIT), так вот там как быстро не шли - всё проихсодит чётко и без задоринки. Думал использовать NetworkManager в льюите - но как я понял, он http-шный, а мне нужно именно сокет-соединение. Заранее спасибо за помощь |
|||
|
||||
| oxigen |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 12.4.2010 Репутация: 4 Всего: 4 |
Если добавите фрагмент кода, который вызывает ошибку, возможно будет проще понять.
Чтение из сокета и добавление в лист в разных потоках происходит? |
|||
|
||||
| QTrueFalse |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
Видимо в разных потоках, потому как главный поток "темы" ЛЬЮИТА запускается в методе run в классе МИДлета:
Ну и это полюбому будет главный поток, так то. А добавление в лист происходит, посути, в потоке, который следит за сетью - inputStream. Ну, фактически в этом потоке есть функция, которая срабатывает как тока чтото появляется во входящем потоке - она вызывает ещё какуюто функцию, в зависимости от того, что пришло - ну вобщем в этом потоке стэк функций свой появляется и в конечной функции происходит обычный
Если НЕ добавлять в лист - то как угодно быстро шли - всё замечательно. А вот если добавить оператор добавления в лист, и он "неуспеет" добавить до того, как придёт чтото ещё по сети - то сразу, почемуто, в inputStream появляется -1 (разрыв соединения) и всё рухается... Эксепшены в этом потоке ловятся - все кэтчи стоят, но ниодин не срабатывает - тупо появляется -1 изниоткуда и всё тут... Я не могу код конкретно показать - он так то у меня на работе, выносить запрещено. Но там и нечего показывать то особо - сетевой поток из обычного САНовского примера для работы с сетью, с сокетами. "NetworkDemo"...
Повторюсь: проблема проявляет себя только тогда, когда друг за другом приходят два сообщения аналогичных. Тоесть типа первое ещё не успело обработаться, а второе уже "стучится"... |
||||||
|
|||||||
| oxigen |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 12.4.2010 Репутация: 4 Всего: 4 |
Мистика )
Но если гадит именно эта строчка, хоть и не понимаю, как она может гадить
то может стоит попробовать убрать ее в отдельный поток. Тогда она по идее никак не будет влиять на чтение.
Это конечно не полноценное решение. Но может поможет понять, что ж там происходит... |
||||
|
|||||
| QTrueFalse |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
Гадит не именно она. Вместо неё вызвается функция, в которой находится switch. Проще говоря эта функция смотрит какая команда пришла и дальше, в зависимости от того, что пришло - либо показывает чтото, либо записывает чтото кудато и тд вобщем. Я пробывал убирать в отдельный поток - но чуть подругому. Я сразу создаю поток который спит, а потом, когда чтото приходит, функций бужу этот поток и передаю туда то, что пришло. (вобщем чтобы стек вызовов разгрузить у потока, который смотрит сеть. Но это тоже не помогает...
Сегодня я заметил ещё один глюк, причём ещё более жестокий. Так вот, если по сети придёт какоето то сообщение, В МОМЕНТ когда ГУИ совершает какое-либо действи(переход с формы на форму, или там анимация какаято), то тупо абсолютно также появляется -1 и всё соединение обрывается. ПРИЧЁМ по сети может придти что угодно, ДАЖЕ НЕ ТРОГАЮЩЕЕ элементы ГУИ, библиотеку и тд- просто если чтото послать в момент когда ГУИ чтото анимирует - сеть падает, вот и всё... не знаю, может это както наведет вас на определенные мысли... и както поможет... ибо я дак уже ваще внепонятках совершенно... |
|||
|
||||
| oxigen |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 12.4.2010 Репутация: 4 Всего: 4 |
Странное поведение.
Никаких разумных мыслей нет. Разве что баг конкретного телефона/симулятора.. |
|||
|
||||
| QTrueFalse |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
oxigen, спасибо, всё разобрался вроде
Спасибо за ответы |
|||
|
||||
![]()
|
FAQ раздела лежит здесь! |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java ME (J2ME) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |