【发布时间】:2015-06-04 03:27:36
【问题描述】:
我正在运行一个简单的应用程序,它在加载时会显示一个项目列表,单击时会打开一个播放媒体的视频播放器。
我遇到了一个问题,即在销毁播放器并返回列表视图时,在注册任何事件之前都会有很长的延迟。这是由于播放器的拆除需要几秒钟。
我已询问支持人员,他们建议最好的解决方法是简单地隐藏播放器并在单击新媒体时再次显示,但我一直在阅读线程,似乎这可能是最好的改用的方法?我不确定它们是如何工作的。 如果我在 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.
【问题讨论】:
标签: java android multithreading