在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线程运行没有?或者我想念一下?
答案 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线程,但可能需要是这不错,因为在调用中-back处理程序方法,您通常要么调用另一个异步方法,要么调用低延迟方法(例如HandlerThread
)。MediaPlayer.start
)。