Перейти к содержанию
Fire Monkey от А до Я
  • 0

Поток в Firemonkey Android для скачивания TXT


yooSee

Вопрос

Доброе время суток .

Я только начал знакомится с потоками , не судите меня строго .

Вот код . Смысл которого через отдельный поток загружать текст с сервера и отображать в memo. Что я делаю? На сервере из вне имеется файлкоторый по api запросам пополняется. Его нужно в потоке постоянно выводить в memo. подгружать каждый раз. При использовании на win вес работает, на андроид не качает и не сздает файл в чем может быть проблема?

type
  ThreadHTTP = class(TThread)
  private

  public
    Stream: TMemoryStream;
    i: integer;

    procedure Execute; override;
    procedure ShowResult;
  end;

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled := true;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
var
  MyHTTP: ThreadHTTP;
begin
  ProgressBar1.Value := 0;
  MyHTTP := ThreadHTTP.Create(False);
end;

{ ThreadHTTP }

procedure ThreadHTTP.Execute;
var
  j: integer;
begin
  inherited;
  i := 0;
  j := 0;
  Stream := TMemoryStream.Create;
  Form1.IdHTTP1.Get('http://сайт/base.txt', Stream);
  Form1.ProgressBar1.Max := Stream.Size;
  while j <= Stream.Size do
  begin
    inc(i);
    Synchronize(ShowResult);
    inc(j);
    Form1.ProgressBar1.Value := Form1.ProgressBar1.Value + 1;
  end;

  Stream.SaveToFile(tpath.getdownloadspath + '/base.txt');


  Form1.Memo1.Lines.LoadFromFile(tpath.getdownloadspath + '/base.txt');
  Stream.Free;
end;

procedure ThreadHTTP.ShowResult;
begin
  Form1.Label1.Text := IntToStr(i) + ' kbs';
end;

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 1
  • Модераторы

во первых: синхронизация сделана не правильно

во вторых: в примерах студии есть демка с отображением индикатора загрузки

в третьих: создание TIdHTTP (лучше заменить на THTTPClient) нужно делать в потоке

 

код на коленке, без TThread

// uses System.Threading
TTask.Run(
procedure 
var 
  aHTPP: THTTPClient;
  aStream: TStringStream;
  aResult: String;
begin
  aResult := ''; 
  aHTPP := THTTPClient.Create;
  aStream := TStringStream.Create('', TEncoding.UTF8);
  try
	aHTTP.Get('урл://', aStream);
	aResult := aStream.DataString;
  finally
	FreeAndNil(aHTPP);
	FreeAndNil(aStream);
  end;
  
  TThread.Synchronize(TThread.CurrentThread, 
	procedure 
	begin 
	  Memo1.Text := aResult;
	end)
end)

 

Ссылка на комментарий
  • 0
7 минут назад, Равиль Зарипов (ZuBy) сказал:

во первых: синхронизация сделана не правильно

 а можно пример как правильно?

8 минут назад, Равиль Зарипов (ZuBy) сказал:

во вторых: в примерах студии есть демка с отображением индикатора загрузки

если честно не особо важен в проекте индикатор загрузки. 

Ссылка на комментарий
  • 0
  • Модераторы
4 минуты назад, Роман Фил сказал:

а можно пример как правильно?

ответил в предыдущем сообщении

Ссылка на комментарий
  • 0
17 минут назад, Равиль Зарипов (ZuBy) сказал:

ответил в предыдущем сообщении

26 минут назад, Равиль Зарипов (ZuBy) сказал:

 


 
  TThread.Synchronize(TThread.CurrentThread, 
	procedure 
	begin 
	  Memo1.Text := aResult;
	end)
end)

 

это отдельная процедура? чет я туплю как она с потока вызвалась?

Подставляю ваш пример в поток , тишина.

Ссылка на комментарий
  • 0
  • Модераторы

уберите свой поток, вставьте код (на кнопку например) который я написал изменив адрес урл на верный.

и посмотрите что произойдет

Ссылка на комментарий
  • 0
18 минут назад, Равиль Зарипов (ZuBy) сказал:

уберите свой поток, вставьте код (на кнопку например) который я написал изменив адрес урл на верный.

и посмотрите что произойдет

А будет ошибка - No mapping for the unicode character exist in the target multy byte code page

 

стоп , тупой проглядел 

TEncoding.UTF8 в 
TEncoding.ANsi
Изменено пользователем Роман Фил
Ссылка на комментарий
  • 0
45 минут назад, Равиль Зарипов (ZuBy) сказал:

уберите свой поток, вставьте код (на кнопку например) который я написал изменив адрес урл на верный.

и посмотрите что произойдет

Извиняюсь что не по теме чуть чуть, все работает отлично, спасибо!) На сервере есть index.php и base.txt при записи в него через get запрос 

var
  s: string;
begin
  s := utf8toansi(Edit1.Text);
  WebBrowser1.Navigate
    (('урл/?adstext=' + s));

то приходят иероглифы. файл base.txt в ansi отправляю в ansi читаю в ansi выводит . в index.php нет каких либо переводов в кодировки вот что там

<?PHP
$filename = "base.txt"; 
$name_var='adstext';

// проверка существования файла 
if (file_exists($filename)) { 
  $file = fopen($filename, "a"); 
} else { 
  $file = fopen($filename, "a"); 
} 
$text = $_GET[$name_var]."\n"; 

fwrite($file, $text); 

fclose($file); 

?>

 

Ссылка на комментарий
  • 0
  • Модераторы

есть два решения:

1) использовать base64

2) urlencode (сделать перед отправкой на сервер), urldecode (перед записью в файл)

Ссылка на комментарий
  • 0
В 15.06.2017 в 09:15, Равиль Зарипов (ZuBy) сказал:

в третьих: создание TIdHTTP (лучше заменить на THTTPClient) нужно делать в потоке

 

а чем TIdHTTP не нравится?

Изменено пользователем Player
Ссылка на комментарий
  • 0

если я помню все правильно, то оф. ссылка гугл именно https

но экспериментально установлено, что http тоже работает. но никто не гарантировал, что всегда будет так

Ссылка на комментарий
  • 0
В 15.06.2017 в 09:15, Равиль Зарипов (ZuBy) сказал:

во первых: синхронизация сделана не правильно

во вторых: в примерах студии есть демка с отображением индикатора загрузки

в третьих: создание TIdHTTP (лучше заменить на THTTPClient) нужно делать в потоке

 

код на коленке, без TThread


// uses System.Threading
TTask.Run(
procedure 
var 
  aHTPP: THTTPClient;
  aStream: TStringStream;
  aResult: String;
begin
  aResult := ''; 
  aHTPP := THTTPClient.Create;
  aStream := TStringStream.Create('', TEncoding.UTF8);
  try
	aHTTP.Get('урл://', aStream);
	aResult := aStream.DataString;
  finally
	FreeAndNil(aHTPP);
	FreeAndNil(aStream);
  end;
  
  TThread.Synchronize(TThread.CurrentThread, 
	procedure 
	begin 
	  Memo1.Text := aResult;
	end)
end)

 

 

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

Сейчас при отключенном интернете, вллбще ни каких сообщений не выходит и код в секции  "TThread.Synchronize" не отрабатывает?

Ссылка на комментарий
  • 0

e THttpClient есть свойства в которых есть слово Timeout. Их можно установить, и запрос будет вываливаться по Exception

поэтому нужно добавить обработку Try Except  вместо или дополнительно к Try Finally

в обработчике Except можно куда-то записывать результат или так же через синхронизацию например выводить сообщение на экран

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...