• 0
Иван Р

Поток в Android-е

Вопросы

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

procedure TForm2.Button1Click(Sender: TObject);
begin
  TTask.Run(
    procedure
    begin
      TThread.Synchronize(TThread.CurrentThread,
        procedure
        begin
          MediaPlayer1.FileName :=
            'http://cdndl.zaycev.net/228184/8640962/lana_del_rey_-_hope_is_a_dangerous_thing_for_a_woman_like_me_to_have_but_i_have_it_%28zaycev.net%29.mp3?ext.page=default';
          MediaPlayer1.Play;
        end);
    end);
end;

end.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 ответов на этот вопрос

  • 0
46 минут назад, Иван Р сказал:

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

 

Покажите, пожалуйста, код доп.потока....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
9 часов назад, #WAMACO сказал:

Покажите, пожалуйста, код доп.потока....

Это весь код больше ничего нет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, Иван Р сказал:

Это весь код больше ничего нет

Тут нет кода, выполняемого в доп.потоке.
Метод Synchronize делает следующее: "приостановить выполнение себя (т.е. доп.потока), переключиться в основной поток, выполнить там действие и после этого вернуться в себя (в доп.поток)".
Ввиду того, что в коде доп.потока есть только synchronize - то единственное, что поток делает - ждёт, пока выполнится его действие в основном потоке.

То есть - является абсолютно бессмысленным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, Иван Р сказал:

покажите, пожалуйста, правильный пример 

Покажите, пожалуйста, правильную задачу, которую пытаетесь решить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, kami сказал:

Покажите, пожалуйста, правильную задачу, которую пытаетесь решить.

Задача с помощью стандартного плеера воспроизвести музыку не сохраняя ее на устройстве, то есть онлйн

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
12 часов назад, Иван Р сказал:

Задача с помощью стандартного плеера воспроизвести музыку не сохраняя ее на устройстве, то есть онлйн

С помощью стандартного (тот что в палитре компонентов Delphi) это сделать затруднительно. Вам нужно написать свои реализации классов TMedia и TCustomMediaCodec. Это долгий и муторный путь. Но можно забыть про куцую оболочку Эмбаркадеро под названием TMediaPlayer, и все становиться гораздо проще:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText,
  FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FPlayer : JMediaPlayer;
  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  FPlayer:=TJMediaPlayer.Create;
  FPlayer.setDataSource(StringToJString('http://cdndl.zaycev.net/228184/8640962/lana_del_rey_-_hope_is_a_dangerous_thing_for_a_woman_like_me_to_have_but_i_have_it_%28zaycev.net%29.mp3'));
  FPlayer.prepare;
  FPlayer.Start();
end;

end.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
21 час назад, Евгений Корепов сказал:

С помощью стандартного (тот что в палитре компонентов Delphi) это сделать затруднительно. Вам нужно написать свои реализации классов TMedia и TCustomMediaCodec. Это долгий и муторный путь. Но можно забыть про куцую оболочку Эмбаркадеро под названием TMediaPlayer, и все становиться гораздо проще:


unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText,
  FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FPlayer : JMediaPlayer;
  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  FPlayer:=TJMediaPlayer.Create;
  FPlayer.setDataSource(StringToJString('http://cdndl.zaycev.net/228184/8640962/lana_del_rey_-_hope_is_a_dangerous_thing_for_a_woman_like_me_to_have_but_i_have_it_%28zaycev.net%29.mp3'));
  FPlayer.prepare;
  FPlayer.Start();
end;

end.

 

Спасибо вам за ответы, но с потоком я так и не разобрался.

Вот прикрепляю проект, в котором воспроизведения радио (а в данном случае просто mp3) в потоке.

На win все работает а на Андроиде нет.

https://yadi.sk/d/-o60o4z6hC_DqA

Прикрепить не получилось, загрузил в диск

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Митя Гринюк
      Когда мы на Андроид устройстве клавишей переходим в TaskManager (Менеджер запущенных приложений), мы видим наши Недавние или Запущенные приложения в виде прямоугольников/квадратов.
      А именно: квадратный "скриншот" вместимости приложения и над "скриншотом приложения" размещается TopBar, на котором отображается некоторая информация (ярлык, название приложения и цвет, читаемый с приложения, а именно colorPrimary приложения).   {Android L}
      В моём приложении, независимо от colorPrimary/colorPrimaryDark, TopBar имеет черный цвет.
      Можно ли это как-то изменить?
      Embarcadero RAD 10.2 Tokyo, Delphi.
      (использую модуль, который окрашивает даже StatusBar)
      Ниже прикреплены изображения для ознакомления с терминами.
       
       
    • От DirtyBorov
      Хочу поделится своим модулем, некой альтернативой TTask, которой я пользуюсь уже довольно продолжительное время.  Возможно кому то будет полезно. 
      AsyncTask это глобальная функция в модуле, которая возвращает интерфейс IAsyncTask. По этой причине нет нужды специально создавать объект и заботится о его удалении.
      Пример использования:
      procedure GetAsyncRequest(const aUrl: string); var LResult: string; begin AsyncTask.Run( procedure begin // это основной метод потока, он не синхронизирован. От сюда нельзя обращатся к визуальным компонентам // или переменным вне функции без синхронизации (если необходимо) LResult := HttpRequest.Get(aUrl); end, procedure begin // Эта процедура выполнится при успешном завершении потока (без exception). // Процедура синхронизированна, по этому тут можно обращатся к любым визуальным компонентам ShowMessage(LResult); end, procedure(E: Exception) begin // Эта процедура выполнится только если во время работы потока произошла ошибка ShowException(E); end, procedure begin // Эта процедура выполнится в любом случае (после завершения потока), в не зависимости была ошибка или нет ShowMessage(LResult); end ); // обратите внимание, что обязательно задать только первую процедуру, остальные можно не указывать или передать вместо них nil. Например так: AsyncTask.Run( procedure begin ... end, nil, procedure(E: Exception) begin ShowException(E); end);  
      Async.Task.pas.zip
    • От zekelive
      Товарищи, хотел с Вами посоветоваться, как лучше реализоваться динамическое создание компонентов. В моем приложении, при нажатии на ListBoxitem происходит динамическое создание определенного количества объектов (TRectangle, label, ListBoxItem). и т.к. загрузка занимает примерно 2-4 секунды, хотел поставить TfgActivityDialog для удобства отображения загрузки, но суть в том, что понятное дело на момент создания компонентов ActivityDialog подвисает. Была идея про поток, но создание компонентов в потоке к хорошему не приводит и вываливаются разные ошибки. Как в таких случаях поступаете ВЫ?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу