android上的firemonkey线程显示黑页

时间:2017-01-25 19:57:59

标签: firemonkey delphi-10.1-berlin

我使用httpd从互联网上请求一些数据

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是否更好地访问Web服务?

1 个答案:

答案 0 :(得分:2)

您的代码不是线程安全的。您的线程直接访问UI控件而不与主UI线程同步。仅此一点就可能导致问题。

此外,var的{​​{1}}部分中声明的所有变量都应该移到匿名过程的requestToServer()部分,因为var不使用它们,所以它们可以完全是本地的线程。匿名过程应该捕获的唯一内容是requestToServer()内容。

尝试更像这样的事情:

lParamList