java - 在后面,在不延迟主线程的情况下终止 Activity

标签 java android multithreading

我正在运行一个简单的应用程序,该应用程序在加载时会显示一个项目列表,单击该按钮会打开一个播放媒体的视频播放器。

我遇到一个问题,当销毁播放器并返回列表 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/

相关文章:

java - 传入和传出蓝牙连接的并发线程

javascript - 中断驱动与事件驱动 I/O 模型

java - 如何定位td和<a中的元素

Java小程序不会移动图像

java - 当文本不断打印到控制台时读取用户输入(没有诅咒?)

javascript - 安卓、苹果登录

Android 广播接收器 : perform network call and play sound

java - 删除帐户、银行程序

java - Smack Android 客户端无法连接 ejabberd 服务器

android - 在android中使用广播接收器的电话状态监听器不工作