In einem mobilen Projekt für Android und iOS verwende ich bisher zum Download von Dateien in einen Stream System.Net.HttpClient und verarbeite dann das Ergebnis:
Code:
mstream := TMemoryStream.Create;
try
DownloadFile('https://www.example.de/datei.txt', mstream);
memWerte.LoadFromStream(mstream, TEncoding.ANSI);
except
on E:
Exception do
showmessage(E.Message)
end;
mstream.Free;
Da Android die damit verbundene Wartezeit für den User nicht schätzt, habe ich eine
Unit erstellt, die die Datei in einem synchronen Thread lädt. Das ist wohl das empfohlene Verfahren.
Die
Unit funktioniert im Testprojekt auch und synchronisiert den Ergebnisstream in den Hauptthread über DownloadComplete zurück:
Code:
procedure TForm1.DownloadComplete(const stream: TStream; Success: Boolean);
begin
if Success then
begin
memWerte.lines.LoadFromStream(stream)
end
else
Label1.Text := 'Download failed';
end;
Mein Problem nun:
Wie bekomme ich das Ergebnis, das DownloadComplete liefert, am besten unter einen Hut mit dem Hauptstream?
Muss ich dazu einen Timer einrichten, der zyklisch prüft, ob memWerte.lines schon <> '' ist oder gibt es einen eleganteren Weg?
Hier der Aufruf des Thread Downloads:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
Downloader: TFileDownloader;
mstream: TMemoryStream;
begin
try
mstream := TMemoryStream.Create;
Downloader := TFileDownloader.Create('https://www.example/datei.txt', mstream);
Downloader.OnDownloadComplete := DownloadComplete;
Downloader.Start;
finally
mstream.Free;
end
end;