Delphi XE5 Android线程导致应用程序崩溃

Delphi XE5 Android线程导致应用程序崩溃,android,multithreading,delphi,delphi-xe5,Android,Multithreading,Delphi,Delphi Xe5,我有一个线程从远程Datasnap服务器下载并保存clientDataset文件cds文件 这个线程可以在Windows、IOS(模拟器、Iphone、Ipad)上运行,但不能在Android上运行 该应用程序在完成文件下载并保存到Android上后崩溃 代码很简单 线程: TDownloadSaveRemoteDBThread = class (TThread) public Username,Password,host,port : String; error

我有一个线程从远程Datasnap服务器下载并保存clientDataset文件cds文件

这个线程可以在Windows、IOS(模拟器、Iphone、Ipad)上运行,但不能在Android上运行

该应用程序在完成文件下载并保存到Android上后崩溃

代码很简单

线程:

TDownloadSaveRemoteDBThread = class (TThread)
public
  Username,Password,host,port : String;
  error                      : String;
  Folder                     : String;
  ServerMethod               : String;
  filename                   : String;
protected
  procedure Execute; override;
end;

procedure TDownloadSaveRemoteDBThread.Execute;
var
  sqlCon : TSqlConnection;
  cds    : TClientDataset;
  ssm    : TSqlServerMethod;
  dpr    : TDataSetProvider;
begin
  inherited;

  error :='';
  SqlCon:=TSQLConnection.Create(nil);
  try
    sqlCon.DriverName:='Datasnap';
    sqlCon.LoginPrompt:=false;
    sqlCon.Params.Values['hostname']:=host;
    sqlCon.Params.Values['port']:=port;
    sqlCon.Params.Values['UserName']:=Username;
    sqlCon.Params.Values['Password']:=Password;
    try
      sqlCon.Open;
      cds:=TClientDataset.Create(nil);
      ssm:=TSqlServerMethod.Create(nil);
      dpr:=TDataSetProvider.Create(nil);
      try
        ssm.SQLConnection:=SqlCon;
        ssm.ServerMethodName:=ServerMethod;
        dpr.DataSet:=ssm;
        cds.SetProvider(dpr);
        cds.Open;
        cds.SaveToFile(folder+filename);
        cds.Close;
      finally
        cds.free;
        ssm.free;
        dpr.free;
      end;
    Except
      on E : Exception do
      Begin
        error:=E.Message;
        SQLCon.Close;
      End;
    end;
  finally
    SQLCon.Close;
    SQLCon.free;
  end;
end;
在我的主窗体“开始窗体”中有一个启动线程的按钮

procedure TStartForm.Button1Click(Sender: TObject);
var
  DownloadSaveRemoteDBThread : TDownloadSaveRemoteDBThread;
begin
  DownloadSaveRemoteDBThread:= TDownloadSaveRemoteDBThread.Create(true);
  DownloadSaveRemoteDBThread.OnTerminate:= StartForm.ferdigHentDB;
  DownloadSaveRemoteDBThread.Password:='test';
  DownloadSaveRemoteDBThread.Username:='test';
  DownloadSaveRemoteDBThread.host:=edit1.text; //127.0.0.1
  DownloadSaveRemoteDBThread.port:='211';
  DownloadSaveRemoteDBThread.Folder:=System.IOUtils.TPath.GetDocumentsPath +  PathDelim +'db'+  PathDelim;
  DownloadSaveRemoteDBThread.ServerMethod:= 'TServerMethods2.hentselect3';
  DownloadSaveRemoteDBThread.filename:='select3.cds';
  DownloadSaveRemoteDBThread.FreeOnTerminate:=true;
  DownloadSaveRemoteDBThread.Start;
end;
然后线程完成后,我有这个简单的过程

procedure TStartForm.ferdigHentDB(sender: Tobject);
begin

  with sender as TDownloadSaveRemoteDBThread do
  Begin
    if error > '' then
    Begin
      showmessage(error);
    End;
  End;
end;

关于Android崩溃的原因有什么建议吗?这个问题有没有简单的解决方法?

XE5中的TThread在Android上有两个主要错误
Sychronize()
Queue()
被破坏(
Synchronize()
用于触发
OnTerminate
事件),并且如果线程使用任何JNI对象,则
TThread
在终止之前不会从Android JVM中分离。尚未修复。第二个bug在XE6中已修复,但在XE5中有一个可以使用的bug。

如果android版本支持多线程连接,您是否查阅了数据库驱动程序的文档?谢谢,但我可以找到如何实现修复的方法。过程
MyEndThreadProc(ExitCode:Integer)
在我的system.classes中,我发现这个代码`{$ELSEIF Defined(POSIX)}如果赋值(EndThreadProc),那么EndThreadProc(Result);pthread_退出(结果);{$ENDIF POSIX}`有没有人举个例子说明如何在system.classes中分配MyEndThreadProc我发布的链接中有什么不清楚的地方?它准确地告诉您如何实施修复
EndThreadProc
是一个函数指针。只需将提供的函数复制到代码中,然后在应用程序启动时将其地址分配给
System.Classes.EndThreadProc
变量即可<每当基于
TThread
的线程终止时,code>TThread将调用您的函数。