![]() |
|
Модераторы: javastic, AntonSaburov |
![]()
|
|
| kazna4ey |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 7.3.2007 Репутация: нет Всего: нет |
Есть сетевое приложение. При обращении к серверу и скачивании с него файла на дисплей должен выводиться экран ожидания с подвижным элементом (индикатор загрузки). Проблема в том, что метод скачивания запускается в отдельном потоке (иначе никак), но при это основной поток мидлета ждет завершения работы этого метода, и отрисовка экрана ожидания идет только после получения файла, даже если прописать отрисовку до вызова метода скачивания. Долго бился, но ничего не получается, может кто подскажет...
|
|||
|
||||
| Antropoid |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 786 Регистрация: 1.6.2006 Где: &Ukraine==Ode ssa Репутация: 13 Всего: 16 |
а если при этом закомметировать вызов потока, который обращается к серверу, - прорисовка работает? как вариант, - делай прорисовку тоже в отдельном потоке -------------------- ![]() Задыхаясь от восторга заниматься чепухой. |
|||
|
||||
| javastic |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1214 Регистрация: 18.3.2005 Где: St.Petersburg Репутация: 19 Всего: 27 |
Antropoid, прав. Вызывай прорисовку в отдельном потоке который будет запущен из потока скачивания.
-------------------- 01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011 scjp, mcp |
|||
|
||||
| nagliyvred |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 2.10.2005 Репутация: 3 Всего: 3 |
А если как-нибудь так?
|
|||
|
||||
| Dancer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: 33 Всего: 37 |
nagliyvred, рабоать будет, но за такой код, я бы "убил" на месте!
-------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! |
|||
|
||||
| nagliyvred |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 2.10.2005 Репутация: 3 Всего: 3 |
за что именно? |
|||
|
||||
| W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
Все классы взяты со старого кода и подлампичены.. Это так, чтоб увидеть логику. НО!!! Это неправильная архитектуа. То есть как бы удобно и просто, для j2me потянет. Но вот для BlackBerry и большой джавы не пойдет. Ибо на самом деле нельзя менять экран из другого потока(нужно ток из главного). Блекберри эксепшн кидает в этом случае. Еще картинку прилепил как это все наглядно работает. Присоединённый файл ( Кол-во скачиваний: 22 )
SequenceDiagramLogin.JPG 55,17 Kb-------------------- iOS developer |
|||
|
||||
| W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
не факт, что успеет запуститься поток. И твой цикл может ваще не пройти, а поток будет работать Это сообщение отредактировал(а) W0LF - 20.6.2007, 18:31 -------------------- iOS developer |
|||
|
||||
| Dancer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: 33 Всего: 37 |
Во-первых, код не безопасен, то есть, в работе этого кода потенциальная бажина!!!
public void run() { connectionAccomplished = false; // здесь соединение Если здесь произойдёт Exception или Error, то у нас всё равно будет перерисовка работать в while(), так как connectionAccompished не будет true. // здесь оно закончилось connectionAccomplished = true; } Во-вторых, пользователю нужно что-то скачать, но это не значит, что нужно после этого разорвать соединение, то есть, соединение будет сохраняться, а закачка уже завершилась, и..., то есть while() для перерисовки будет работать..... В-третьих, inner классы (объекты new Thread(){}.start() и т.д.) - это большое зло и достаточно солидная уязвимость для J2ME приложений в частности. пусть у нас файл Test.java в нём у нас будет что-то вроде такого вот new Thread() то после компиляции у нас получится Test.class Test$1.class можно подменить Test$1.class подделанным и получить доступ к переменным или методам Test.class. С inner классами нужно быть очень аккуратным в использовании. В-четвёртых, для коннекшена лучше сделать в приложении отдельный класс, и возможно даже абстрактный и добавить ко всему этому менеджер коннекшенов (ну это если нужно и для "будущих периодов" скажем так). Так вот, будет когда у нас менеджер коннекта, мы можем предусмотреть интерфейс специальный, который позволит нам сказать, что происходит закачка и процент закачки такой-то. А компонента (в отдельном потоке), которая должна делать отрисовку будет имплементить метод этого интерфейса и в нём дёргать notify(); repaint(); и потом вызывать у потока wait() тогда мы избавляемся от лишних вызовов в while(). (ну это уже архитектурные изыски скажем так) Список при желании можно и продолжить, это я накидал сразу, "навскидку" так скажем. -------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! |
|||
|
||||
| nagliyvred |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 2.10.2005 Репутация: 3 Всего: 3 |
Забавно.
Чтож, этот набросок не претендовал на полноценный пример кода. Я поленился и не стал писать кучу кода(каюсь), лишь попробовал подсказать прием, который можно использовать в коде - ждать завершения потока по флагу и при этом перерисовывать экран - по-моему очевидно что тут нет полноценной реализации. Ну да ладно...
Ну да, для этого переменную нужно обязательно зафолсить перед создаением Thread...
Ну так я же не привел реализацю метода run() целиком! Естественно нужно оборачивать код в try{ } catch() {} особенно если там конекшн, оно без этого и не скомпиляется - run() не должен выбрасывать IOException'ы .
Из этого куска вообще никак не следует каким образом мы будем работать с сетью в том потоке. Будет оно сохраняться или нет - это можно легко реализоваать так как нужно.
Зло? Возможно. Если плодить их на каждом шагу. Любой метод имеет область и разумные границы применимости. А то что Вы пишете про безопасность это вообще извращение. Если программа работает с каким-нибудь web-money через https или с чем другим ( и ее вообще есть смысл зачем-то ломать) то да, Вы несомненно правы. Но к таким приолжениям вообще требования безопасности совсем другие. К чему такие параноидальные мысли в "рядовых" приложениях которые вообще непонятно зачем ломать?)
Да, так можно сделать. И лучше. Мой метод не претендует на идеальность! Я вешал рекламу "Делайте так везде! Даешь этот способ в массы!" и прочее=) А список продолжайте.. Хотелось бы все-таки выяснить до конца достоинства-недостатки. Чтобы можно было делать так, когда это разумно сделать, и избегать этого ,когда этот способ неподходит |
||||||||||
|
|||||||||||
![]()
|
FAQ раздела лежит здесь! |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java ME (J2ME) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |