我正在运行一个简单的应用程序,该应用程序在加载时会显示一个项目列表,单击该按钮会打开一个播放媒体的视频播放器。
我遇到一个问题,当销毁播放器并返回列表 View 时,注册任何事件之前会有很长的延迟。这是由于播放器的拆卸需要花费几秒钟的时间。
我问过支持人员,他们建议最好的方法是简单地隐藏播放器,并在单击新媒体时再次显示,但是我一直在阅读内容,这似乎是最好的使用方法反而?我不太确定它们是如何工作的。
如果我取消了onDestroy中的播放器服务,是否仍会发起新的播放器服务?
public class DemoPlayer extends Activity {
private Player player;
private SeekBarScrubber scrubber;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.player);
// Set the media url holder
String mediaUrl = "";
player = new Player(
// inject player container view into ADK Player
(ViewGroup) this.findViewById(R.id.tpPlayer)
);
// Build application UI
scrubber = (SeekBarScrubber) findViewById(R.id.scrubber);
scrubber.setMediaPlayerControl(player.asMediaPlayerControl());
final Activity activity = this;
try {
URI mediaUri = new URI(mediaUrl);
player.playReleaseUrl(mediaUri);
} catch (URISyntaxException e) {
AlertDialog alertDialog = new AlertDialog.Builder(activity).create();
alertDialog.setTitle("Invalid URL");
alertDialog.setMessage("Issue loading media");
alertDialog.setCancelable(true);
alertDialog.show();
}
}
@Override
protected void onDestroy() {
new Thread(new Runnable() {
public void run() {
if (player != null)
player.getLifecycle().destroy();
player = null;
}
}).start();
ViewGroup viewGroup = (ViewGroup) this.findViewById(R.id.tpPlayer);
viewGroup.removeView(scrubber);
scrubber = null;
super.onDestroy();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
finish();// call finish() on click of back button
}
return super.onKeyDown(keyCode, event);
}
}
TL; DR:如何在不按住UI线程的情况下杀死播放器,因为消灭播放器需要花费几秒钟的时间。另外,加载新玩家会很快引起问题吗?
目前收到以下错误
failed access media controller because player thread is shutdown
Skipped 374 frames! The application may be doing too much work on its main thread.
最佳答案
创建 View 时,播放器将附加到该 View ,而不是相反。因此,我认为您最好的选择是将玩家移动到一个单例,并不管 Activity 的生命周期如何,将其启动/停止。当然,您可以关闭后台线程(我建议您阅读有关线程池和执行程序的信息,因为我很少在android上看到Thread.start()。
还:
ViewGroup viewGroup = (ViewGroup) this.findViewById(R.id.tpPlayer); viewGroup.removeView(scrubber); scrubber = null;
这是没有必要的。
关于java - 在后面,在不延迟主线程的情况下终止 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30634441/