[英]does this code need to be run in the android UI thread?
在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 线程运行,不是吗? 还是我错过了什么?
根据该文档的MediaPlayer
,将呼叫MediaPlayer.prepare
不应该在UI线程上执行。 如果此代码可能在 UI 线程上运行,则应将调用更改为MediaPlayer.prepareAsync
。
PS在Android中, UI线程和主线程是一回事。 例如,请参阅这篇文章。
PPS 我没有意识到在 Delphi 中,主线程是不同的。 不过,我的猜测是,在 Delphi 中阻止主线程与在 Android 中阻止 UI/主线程一样糟糕。 您发布的代码将阻止正在执行它的任何线程,直到prepare
返回。
关于使用异步方法( prepareAsync
等)的问题: prepareAsync
( OnPreparedListener.onPrepared(MediaPlayer)
等)将发生在 UI 线程上。
调用原始异步方法的线程,无论线程是什么(不必是 UI 线程,但可能需要是
这还不错,因为在回调处理程序方法中,您通常要么调用另一个异步方法,要么调用低延迟方法(例如HandlerThread
)。
MediaPlayer.start
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.