繁体   English   中英

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

[英]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等)的问题: prepareAsyncOnPreparedListener.onPrepared(MediaPlayer)等)将发生在 UI 线程上。 调用原始异步方法的线程,无论线程是什么(不必是 UI 线程,但可能需要是 HandlerThread )。 这还不错,因为在回调处理程序方法中,您通常要么调用另一个异步方法,要么调用低延迟方法(例如MediaPlayer.start )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM