![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Доброго времени суток Уважаемые форумчане!
Кратко поясню ситуацию данной темы. Есть сайт расписания учебного заведения, возникла необходимость написать мини приложение для андроид смартфонов которое бы это расписание загружало и отображало как в онлайн так и в оффлайн режиме. Данное приложение уже написано и работает. НО! Некоторые операции которые приложение выполняет обрабатываются ~20 сек. (в зависимости от скорости интернета и т.п.), при этом в приложении (как и в случаи с VLC) виснет интерфейс на время выполнения операции. А хотелось бы показывать прогресс выполнения операции, хотя бы частями. Ниже привожу код выполнения операции получения списка групп/преподавателей. Сильно не ругайте, если считаете код плохим. ![]() Похоже что необходимо делать потоки данных, либо грамотно пользоваться оператором sleep(); К сожалению практики в этом нету. Жду от Ваших ответов - советов, может ссылок полезных. Если у кого то найдется время/желание помочь изменить код на примере одной данной операции, буду очень признателен!!))) Код:
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, FMX.StdCtrls, FMX.Layouts, FMX.Memo, FMX.ListBox; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; IdHTTP1: TIdHTTP; Button2: TButton; Memo2: TMemo; Button3: TButton; ComboBox1: TComboBox; ComboBox2: TComboBox; Memo3: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public function Pars(T_, ForS, _T:string):string; end; var Form1: TForm1; html,group,teach:string; // глобальные переменные implementation {$R *.fmx} function TForm1.Pars(T_, ForS, _T: string): string; // функция для парсинга var a, b:integer; begin Result := ''; if (T_='') or (ForS='') or (_T='') then Exit; a:=Pos(T_, ForS); if a=0 then Exit else a:=a+Length(T_); ForS:=Copy(ForS, a, Length(ForS)-a+1); b:=Pos(_T, ForS); if b>0 then Result:=Copy(ForS, 1, b - 1); end; procedure Button1Click(Sender: TObject); var i:integer; s,s1:string; begin html:=IdHTTP1.Get('http://m.inhk.ru/'); // код странички // 1 часть обработки кода // находим в коде часть со списком групп и их id memo1.text:=pars('<option selected disabled>Выбор группы</option>', html, '</select>'); Memo1.Lines.Delete(0); i:=Memo1.lines.Count; Memo1.Lines.Delete(i-1); // удаляем пустые строчки for i:=0 to memo1.lines.count-1 div 2 do begin if i<Memo1.Lines.count then begin memo1.lines.delete(i); end; end; // получаем названия групп и id без лишних тегов for i:=0 to memo1.lines.count-1 do begin s:=memo1.Lines[i]; s1:=Memo1.Lines[i]; s:=pars('>', s, '<'); s1:=pars('"', s1, '"'); memo2.Lines.Add(s); memo3.Lines.Add(s1); end; // временно заносим id групп group:=memo3.Text; // заносим названия групп в combobox for I := 0 to memo1.lines.count-1 do begin ComboBox1.Items.add(Memo2.Lines.Strings[i]); end; memo1.Lines.Clear; memo2.Lines.Clear; memo3.Lines.Clear; // часть 2 аналогична 1й, только для преподавателей memo1.text:=pars('<option selected disabled>Выбор преподавателя</option>', html, '</select>'); Memo1.Lines.Delete(0); i:=Memo1.lines.Count; Memo1.Lines.Delete(i-1); for i:=0 to memo1.lines.count-1 div 2 do begin if i<Memo1.Lines.count then begin memo1.lines.delete(i); end; end; for i:=0 to memo1.lines.count-1 do begin s:=memo1.Lines[i]; s1:=Memo1.Lines[i]; s:=pars('>', s, '<'); s1:=pars('"', s1, '"'); memo2.Lines.Add(s); memo3.Lines.Add(s1); end; teach:=memo3.text; for I := 0 to memo1.lines.count-1 do begin ComboBox2.Items.add(Memo2.Lines.Strings[i]); end; memo1.Lines.Clear; memo2.Lines.Clear; memo3.Lines.Clear; // заносим id групп и преподавателей Memo1.Text:=group; Memo2.Text:=teach; end; ![]() Последний раз редактировалось LACOSTE, 18.09.2013 в 07:55. |
#2
|
||||
|
||||
![]() Ну, во-первых, эта фича (делфидроид) введена недавно, и я лично не был бы так уверен, что она идеально-стабильная. А вообще, думаю, потоки спасут твою программулину. Гуглить TThread, руководств в Сети - хоть, извиняюсь, попой кушайте.
UPD: Раз юзается Indy - попробуй на форму кидануть IdAntifreeze. Авось проканает. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 18.09.2013 в 09:48. |
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
LACOSTE (22.09.2013)
|
#3
|
|||
|
|||
![]() IdAntifreeze есть только в VLC!
Вообщем перевел все приложение на потоки, ничего не виснет, выполняется все очень быстро) Отличная штука Thread А по поводу сыроватости версии XE5 могу сказать, что, например поддержка переноса приложения на карту памяти не работает, отсутствуют некоторые фичи андроида, как например всплывающие уведомления, приложения очень много весят, тот же hello world - 25mb, если порыться можно еще ворох недостатков найти, а вообще по хорошему для Android нужно Eclipse + Android IDE , как бы Embarcadero не старались сделать свой компилятор под дроид eclipse не заменить, скоро будем в институте изучать java перейду на eclipse) Последний раз редактировалось LACOSTE, 21.09.2013 в 23:36. |
#4
|
|||
|
|||
![]() Цитата:
1. По крайней мере для разбора первой странички я бы рекомендовал честный парсинг в DOM и далее по id тегов получение всего, чего нужно. 2. Смотрел я на это безобразие. Лучше сразу переходи на джаву и не мучай ни себя, ни андроид. Ну или на C++, если очень уж хочется писать нативный код, хотя смысла в этом не вижу. Да, интерфейс на AndroidSDK писать "не айс" (там xml-html-е образное безобразие). Но честно я не вижу смысла писать программы ТОЛЬКО для андроида на Дельфи. только если собираешься потом все портировать и под iOS. PS. Я пользуюсь IntelliJ Idea, мне кажется удобнее, чем eclipse. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
LACOSTE (22.09.2013)
|
#5
|
|||
|
|||
![]() Цитата:
Спасибо за ответ!) Это моя первая и последняя программка для андроид на дельфи)) IntelliJ Idea, посмотрел, мне кстати очень понравилось) Вопрос решен, тему считаю закрытой!) |