android 上的 firemonkey 线程显示黑页

firemonkey threading on android show a black page

我使用 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 服务更好吗?

您的代码不是 thread-safe。您的线程直接访问 UI 控件,而不与主 UI 线程同步。仅此一项就可能导致问题。

此外,在 requestToServer()var 部分中声明的所有变量都应移至匿名过程的 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;