![]() |
|
Модераторы: javastic |
![]()
|
|
| Dapo |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: 1 Всего: 1 |
Доброго всем! Пытаемся реализовать клиентское приложение которое должно соединяться с внешним сервером, отправлять и получать данные. Поиски в интернете результаты дали, но какие-то крайне кастрированные. То опрос затыкался, то ничего не уходило, то были сложности синхронизации запроса/ответа с виджетами на форме. В общем, накидал свой класс для удобной реализации такого приложения, прошу посмотреть, оценить, дать замечания и предложения по улучшению, ибо сам в этой теме новичок:
Использование:
Чтение из сокета будет происходить автоматически, соединение, посылка, разрыв вызываются из основного потока приложения. На onReadData легко можно привязать свой протокол (чего собственно и добиваюсь). Чувствую, что от недопонимания потоковой схемы андроида, я тут наворочал быдлокод, хотя оно работает и не глюкает. Может есть уже готовые устойчиво работающие обертки и я изобретаю велосипед? Помогите отшлифовать - это ведь нужная вещь. Спасибо! |
||||
|
|||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: нет Всего: 54 |
Dapo, какие статьи по Runnable, Thread и Handler читал, поделись ссылками.
а это будет потоко безопасно? mOutString заполняешь в одном потоке а читаешь в потоке mServiceThread. -------------------- Кольцов Виктор Владимирович |
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: 1 Всего: 1 |
Да читал что нашел в интернетах. Если честно, ничего такого не читал, чтобы тема была раскрыта целиком и полностью. Это с миру по нитке + собственные изыскания. Так например, я нигде не нашел метода isReady(), а так же способа вычитывать через буфер как это реализовано у меня. Везде бодро читают сразу стрингом, и без всякой проверки на готовность данных в буфере. Но это не работает (получаем запор на несколько минут, а потом варнинг). Frees, твое замечание я думаю верное, точно также меня смущает и обращение к переменной isConnected. Этот момент хотелось чтобы кто-нибудь объяснил. По hendler-у вроде не так все сложно. Имхо, не важно где он расположен, главное что в моем случае класс создается в основном потоке и хендлер отрабатывает в основном. Т.е. если убрать хендлер.пост и сразу вызвать например onReadData, а в onReadData обратиться к какой-нибудь вьюшке, то получим MainThreadException (так кажется, щас негде посмотреть)
|
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: 1 Всего: 1 |
вообще хитрый класс получается. сам он создается в основном потоке. его методы тоже смотрят в основной поток через тот самы handler, но внутри класса создается паралельный поток переменные внутри которого должны принимать значения из основного потока. Думаю это и есть ключ к пониманию, но мне его пока не хватает
|
|||
|
||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: нет Всего: 54 |
Меня еще смущает что send - void то есть если будут ошибки при отправке об этом сразу и не узнаешь, в одном месте отправил а ошибку в другом видишь...имхо неудобно, но зависит от задачи
-------------------- Кольцов Виктор Владимирович |
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: 1 Всего: 1 |
...стер за ненадобностью... сплошные эмоции
Это сообщение отредактировал(а) Dapo - 31.7.2012, 08:26 |
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: 1 Всего: 1 |
Вот тут кое-что нашел по обращению к "неуловимым" переменным: http://www.sql.ru/forum/actualthread.aspx?tid=909618 и на основе поста пересобрал класс.
Версия 2.
Использование такое же как и в первом посте. Необходимость что-то отправлять идет в проверке string.equals(""). Если во время отправки, основной поток опять сделал send(...), то мы не можем просто очистить исходящую строку в clearSendData потому, что команда потеряется, поэтому я добавил флаг mIsNewData для проверки был ли новый send() или нет. Возможно стоит поставить цикл while (!isNewData()) doSocketWrite;, но я думаю это вопрос конкретной задачи. Что скажет коммунити? PS Чтобы не плодить портянки я здесь еще добавил сброс mSocketStatus в 0 при возникновения исключения. Плюс добавил управляемый таймаут на подключение, думаю это нужная штука. Тогда запуск сокета будет например такой: socket.connect(5000);// даем 5 секунд на установку соединения, если возник таймаут то ловим его в onSocketError по mSocketStatus = 1; Это сообщение отредактировал(а) Dapo - 31.7.2012, 07:35 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Android | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |