2017-01-25 11 views
0

я использовал HTTPD запросить некоторые данные из ИнтернетаFireMonkey нарезания резьбы на андроид шоу черной страница

function requestToServer(lParamList: TStringList) : string; 
var 
    userDataString : string; 
    lHTTP: TIdHTTP; 
    serverResponce : string; 
    aobj: ISuperObject; 
begin 
application.ProcessMessages; 
    TThread.CreateAnonymousThread(
    procedure 
    begin 
     lHTTP := TIdHTTP.Create(nil); 
     try 
      serverResponce := lHTTP.Post('http://domain.com/mjson.php', lParamList); 
      application.ProcessMessages; 
      aobj:= SO(serverResponce); 
      try 
      X := aobj['dta'].AsArray; 
      Except 
      form2.Memo1.Lines.Add('errr'); 
      end; 
      if aobj['result'].AsString = 'lr_102' then 
      begin 
      form2.Label3.Text:='Saved token expired.'; 
      form2.Rectangle2.Visible:=true; 
      end 
      else if aobj['result'].AsString = 'lr_103' then 
      begin 
      form2.Label3.Text:='Auto login.'; 
      //load device data 
      form2.allDeviceListData := X; 
      form2.Hide; 
      form1.show; 
      end; 
      // globalReachedServer:=true; 
     finally 
      lHTTP.Free; 
      lParamList.Free; 
     end; 

     TThread.Synchronize(nil, 
     procedure 
     begin 

     end); 
    end 
).Start(); 
end; 

, но после того, как достичь этой функции приложения показать черную страницу И не не делать ничего, пока вручную близко

Как я могу сделать веб-запрос на заднем плане и без висящей на огне-обезьяне? Какой бот с помощью REST лучше получить доступ к веб-сервису?

ответ

1

Ваш код не является потокобезопасным. Ваш поток напрямую обращается к элементам пользовательского интерфейса без синхронизации с основным потоком пользовательского интерфейса. Это само по себе может вызвать проблемы.

Кроме того, все переменные, объявленные в var разделе requestToServer() должны быть перемещены в var части анонимной процедуры вместо этого, так как requestToServer() не использует их, так что они могут быть полностью локальными по отношению к нити вместо этого. Единственное, что нужно сделать анонимной процедуре, это контент lParamList.

Попробуйте что-то больше, как это:

function requestToServer(lParamList: TStringList) : string; 
var 
    Params: TStringList; 
    Thread: TThread; 
begin 
    Params := TStringList.Create; 
    try 
    Params.Assign(lParamList); 
    except 
    Params.Free; 
    raise; 
    end; 
    TThread.CreateAnonymousThread(
    procedure 
    var 
     lHTTP: TIdHTTP; 
     serverResponce : string; 
     aObj: ISuperObject; 
    begin 
     try 
     try 
      lHTTP := TIdHTTP.Create(nil); 
      try 
      serverResponce := lHTTP.Post('http://domain.com/mjson.php', lParamList); 
      aObj := SO(serverResponce); 
      if aObj['result'].AsString = 'lr_102' then 
      begin 
       TThread.Queue(nil, 
       procedure 
       begin 
        form2.Label3.Text := 'Saved token expired.'; 
        form2.Rectangle2.Visible := true; 
       end 
      ); 
      end 
      else if aObj['result'].AsString = 'lr_103' then 
      begin 
       X := aObj['dta'].AsArray; 
       TThread.Queue(nil, 
       procedure 
       begin 
        form2.Label3.Text := 'Auto login.'; 
        //load device data 
        form2.allDeviceListData := X; 
        form2.Hide; 
        form1.show; 
       end 
      ); 
      end; 
      // globalReachedServer := true; 
      finally 
      lHTTP.Free; 
      end; 
     finally 
      Params.Free; 
     end; 
     except 
     TThread.Queue(nil, 
      procedure 
      begin 
      form2.Memo1.Lines.Add('errr'); 
      end 
     ); 
     end; 
    end 
).Start; 
end; 
+0

Спасибо, для подключения к Интернету и захватить данные лучше использовать 'CreateAnonymousThread' или объявить нить' thread.execute'!?! –

+1

@peimanF. Это не имеет большого значения, поскольку 'CreateAnonymousThread()' является просто оболочкой для 'TThread.Execute()' (у Indy есть 'TIdThreadComponent', который также является оберткой). Лучше будет вопрос, который лучше, «TThread» или «TTask». В любом случае, такие вопросы сводятся к личным выборам. –