Лидеры
Популярный контент
Показан контент с высокой репутацией 28.05.2016 во всех областях
-
Проблемы с отрисовкой
Rusland и ещё один отреагировал Евгений Корепов за вопрос
Накидал примерный проект для корректной работы с потоками. Создаем поток, в который с помощью очереди закидываем задания и в таймере получаем результат выполнения. Вместо изжившего себя TIdHTTP, использовал THTTPClient (вдруг вам понадобится, к примеру, запускать это приложение на 6 андроиде и обращаться по https - Indy такое уже не сможет). Код юнита с потоком: unit UnitGetHttpThread; interface uses classes, SysUtils, System.Generics.Collections, System.SyncObjs, System.Net.HttpClient; type THTTPRec=record Command : String; Query : String; ErrorMsg : String; ErrorCode : Integer; Page : String; Stream : TMemoryStream; ItemImageIndex : Integer; end; THTTPThread=class(TThread) private FQueueRequest: TThreadedQueue<THTTPRec>; FQueueResult: TThreadedQueue<THTTPRec>; FHTTPRec: THTTPRec; function GetHTTP(AHTTPRec: THTTPRec) : THTTPRec; protected HTTPClient: THTTPClient; procedure Execute; override; public constructor Create(AQueueRequest, AQueueResult : TThreadedQueue<THTTPRec>); destructor Destroy; override; end; implementation constructor THTTPThread.Create(AQueueRequest, AQueueResult : TThreadedQueue<THTTPRec>); begin FreeOnTerminate:=False; FQueueRequest:=AQueueRequest; FQueueResult:=AQueueResult; HTTPClient:=THTTPClient.Create; Inherited Create(FALSE); end; destructor THTTPThread.Destroy; begin HTTPClient.Free; inherited Destroy; end; procedure THTTPThread.Execute; begin while Not Terminated do if FQueueRequest.PopItem(FHTTPRec) = TWaitResult.wrSignaled Then begin if FHTTPRec.Command.Equals('stop') then begin FHTTPRec.ErrorCode:=200; FHTTPRec.ErrorMsg:='Ok'; FQueueResult.PushItem(FHTTPRec); Continue; end; FHTTPRec.ErrorCode:=0; FHTTPRec.ErrorMsg:=''; FHTTPRec:=GetHTTP(FHTTPRec); if Not FHTTPRec.Command.Equals('error') then FQueueResult.PushItem(FHTTPRec); end; end; function THTTPThread.GetHTTP(AHTTPRec: THTTPRec) : THTTPRec; Var HTTPResponse: IHTTPResponse; begin try if AHTTPRec.Command.Equals('image') then begin HTTPResponse:=HTTPClient.Get(AHTTPRec.Query,AHTTPRec.Stream); AHTTPRec.ErrorCode:=HTTPResponse.StatusCode; AHTTPRec.ErrorMsg:=HTTPResponse.StatusText; end Else begin HTTPResponse:=HTTPClient.Get(AHTTPRec.Query); AHTTPRec.Page:=HTTPResponse.ContentAsString; AHTTPRec.ErrorCode:=HTTPResponse.StatusCode; AHTTPRec.ErrorMsg:=HTTPResponse.StatusText; end; except AHTTPRec.ErrorCode:=-1; AHTTPRec.ErrorMsg:='ErrorGetURL'; end; Result:=AHTTPRec; end; end. Код основной формы (основного потока): unit UnitFormMain; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Generics.Collections, UnitGetHttpThread, FMX.Layouts, FMX.ListBox, System.JSON; type TFormMain = class(TForm) MainContentDownloadBaseListBox: TListBox; Timer: TTimer; procedure TimerTimer(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } FQueueRequest: TThreadedQueue<THTTPRec>; FQueueResult: TThreadedQueue<THTTPRec>; HTTPThread : THTTPThread; public { Public declarations } procedure GetHTTP(ACommand : String; AListItemIndex : Integer; BaseID : String); procedure FillListBoxImage(AHTTPRec : THTTPRec); procedure FillListBoxItem(AHTTPRec : THTTPRec); end; var FormMain: TFormMain; implementation {$R *.fmx} procedure TFormMain.FormCreate(Sender: TObject); begin Timer.Interval:=10; FQueueRequest:=TThreadedQueue<THTTPRec>.Create(50, 1000, 10); FQueueResult:=TThreadedQueue<THTTPRec>.Create(50, 1000, 10); HTTPThread:=THTTPThread.Create(FQueueRequest,FQueueResult); GetHTTP('json', -1, ''); // запускаем карусель end; procedure TFormMain.TimerTimer(Sender: TObject); Var FHTTPRec : THTTPRec; begin while FQueueResult.PopItem(FHTTPRec) = TWaitResult.wrSignaled do begin if FHTTPRec.ErrorCode=200 then begin if FHTTPRec.Command.Equals('json') then FillListBoxItem(FHTTPRec); if FHTTPRec.Command.Equals('image') then FillListBoxImage(FHTTPRec); if FHTTPRec.Command.Equals('stop') then begin Timer.Enabled:=False; // AniIndicator.Visible:=False; // AniIndicator.Enabled:=False; end; end Else begin Timer.Enabled:=False; // AniIndicator.Visible:=False; // AniIndicator.Enabled:=False; // LabelTitle.Text:='Не удалось получить данные, проверьте подключение к Интернет.'; end; end; end; procedure TFormMain.FillListBoxItem(AHTTPRec : THTTPRec); Var JSON : TJSONObject; I : Integer; BaseName, BaseCaption, BaseCategory, BaseID, BaseData: String; Item, ItemRadio: TListBoxItem; begin JSON := TJSONObject.ParseJSONValue(AHTTPRec.Page) as TJSONObject; if Not Assigned(JSON) then Exit; for I:=0 To JSON.Count-1 do Begin BaseData := JSON.Pairs[i].ToString; BaseData := BaseData.Substring(pos('"', BaseData)); BaseName := BaseData.Remove(pos('"', BaseData) - 1); BaseData := BaseData.Substring(pos('"', BaseData)); BaseData := BaseData.Substring(pos(':', BaseData)); { JSON1 := TJSONObject.ParseJSONValue(BaseData) as TJSONObject; BaseCaption := JSON1.Values['caption'].Value; BaseCategory := JSON1.Values['category'].Value; BaseID := JSON1.Values['id'].Value; } if MainContentDownloadBaseListBox.Items.IndexOf(BaseID) = -1 then Begin Item := TListBoxItem.Create(Self); Item.Height := 120; Item.StyleLookup := 'ListBoxItemDownloadBaseStyle'; Item.Text := BaseID; Item.StylesData['name'] := BaseName; Item.StylesData['caption'] := BaseCaption; Item.StylesData['category'] := BaseCategory; GetHTTP('image', Item.Index, BaseID); // отсылаем в поток запрос на скачивание картинки MainContentDownloadBaseListBox.AddObject(Item); End; End; GetHTTP('stop', -1, ''); end; procedure TFormMain.FillListBoxImage(AHTTPRec : THTTPRec); begin MainContentDownloadBaseListBox.ListItems[AHTTPRec.ItemImageIndex].ItemData.Bitmap.LoadFromStream(AHTTPRec.Stream); end; procedure TFormMain.GetHTTP(ACommand : String; AListItemIndex : Integer; BaseID : String); Var FHTTPRec : THTTPRec; begin FHTTPRec.Page:=''; Timer.Enabled:=True; if ACommand='stop' then begin FHTTPRec.Command:='stop'; FQueueRequest.PushItem(FHTTPRec); end; if ACommand='json' then begin FHTTPRec.Command:=ACommand; FHTTPRec.Query:='https://ссылка получения json'; FQueueRequest.PushItem(FHTTPRec); end; if ACommand='image' then begin FHTTPRec.Command:=ACommand; FHTTPRec.Query:='https://ссылка получения картинки'+BaseID; FHTTPRec.ItemImageIndex:=AListItemIndex; FHTTPRec.Stream:=TMemoryStream.Create; FQueueRequest.PushItem(FHTTPRec); end; end; end. Одним потоком забираем все что нужно из сети - и json данные и картинки, ну и все что еще прикрутите.2 балла -
А не в потоке работает? Попробуй отравлять в Synchronize2 балла
-
я вообще отказался от grid и перешел на ListView даже для десктопа (особенно приятен в berlin), все быстро, память не кушает2 балла
-
я раз 100 уже рассказывал людям разным, что "давайте сначала откроем весь список" - это плохой подход. так что оказывается это не всем очевидно))) в одном месте даже ругался с начальством. а контора при этом писала коммерческое ПО )))2 балла
-
1 балл
-
Слишком большой размер приложения.
zekelive отреагировал AndroidHalfNoob за вопрос
Кстати заметил интересный момент. Одно и тоже приложение на телефоне Samsung S4 mini занимает почти 45 Мб а на планшете Samsung Galaxy tab 10 около 18Мб1 балл -
В Synchronize заработало1 балл
-
Получить доступ к элементу на странице
zairkz отреагировал Andrey Efimov за вопрос
А вам нужно, чтобы пользователь сам кликнул по кнопке "Найти"? Просто если это не нужно, то можно сразу открывать страницу поиска с результатами Яндекс - https://yandex.ru/search/?text=Тест1 балл -
Получить доступ к элементу на странице
zairkz отреагировал Равиль Зарипов (ZuBy) за вопрос
нет такого, работает веб браузер только в режиме показа. даже чтение с него невозможно, не говоря о записи1 балл -
Попробуйте свернуть приложение (only Droid) uses Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText; procedure TForm_Main.AppMinimal; {$IFDEF ANDROID} var Intent: JIntent; {$ENDIF} begin {$IFDEF ANDROID} Intent := TJIntent.Create; Intent.setAction(TJIntent.JavaClass.ACTION_MAIN); Intent.addCategory(TJIntent.JavaClass.CATEGORY_HOME); Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK); TAndroidHelper.Activity.startActivity(Intent); {$ENDIF} end;1 балл
-
так и должно быть это мобильная система программа не имеет права работать, когда система спит WiFi и Bluetooth тоже отключаются когда устройство засыпает1 балл
-
Это далеко не всем очевидно Есть определенная категория пользователей и работающих на них программистов - финансисты. Дык вот, эта категория действительно считает, что они должны видеть все, абсолютно все данные сразу. На самом деле, им это конечно не нужно. Но надо! При этом на предложение сделать lazy load делаются круглые глаза и "не, это слишком сложно". Ну да, лучше получать Out of memory...1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00