这个代码需要在android UI线程中运行吗?

时间:2017-02-05 19:53:46

标签: android delphi firemonkey

在delphi源代码中我看到例如这个过程:

procedure TAndroidVideo.RetreiveVideoSize;
var
  MediaPlayer: JMediaPlayer;
begin
  MediaPlayer := TJMediaPlayer.JavaClass.init;
  MediaPlayer.setDataSource(StringToJString(FileName));
  MediaPlayer.prepare;
  FVideoSize := TSize.Create(MediaPlayer.getVideoWidth, MediaPlayer.getVideoHeight);
  MediaPlayer := nil;
end;

可以从主线程运行。但我认为这是一个错误,这个程序必须从Android UI线程运行没有?或者我想念一下?

1 个答案:

答案 0 :(得分:1)

根据the docs for MediaPlayer,对MediaPlayer.prepare的调用应该在UI线程上执行而不是。如果此代码可能在UI线程上运行,则调用应更改为MediaPlayer.prepareAsync

P.S。在Android中, UI线程主线程是相同的。例如,请参阅this post

P.P.S。我没有意识到在Delphi中,主线程是不同的东西。不过,我的猜测是,阻止Delphi中的主线程同样阻止Android中的UI /主线程也是一个坏主意。您发布的代码将阻止执行它的任何线程,直到prepare返回。

关于使用异步方法(prepareAsync等)的问题:回调(OnPreparedListener.onPrepared(MediaPlayer)等)将在UI线程上发生。 调用原始异步方法的线程,无论是什么线程(不一定是UI线程,但可能需要是HandlerThread)。这不错,因为在调用中-back处理程序方法,您通常要么调用另一个异步方法,要么调用低延迟方法(例如MediaPlayer.start)。