在后面,杀死活动而不延迟主线程

时间:2015-06-04 03:27:36

标签: java android multithreading

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

我遇到的问题是,在销毁播放器并返回列表视图时,在注册任何事件之前会有很长的延迟。这是因为玩家需要几秒钟才能拆除。

我曾问过支持人员,他们建议最好的方法是简单地隐藏播放器并在点击新媒体时再次显示但是我已经阅读了线程,看起来这可能是相反,最好的使用方法是什么?我不确定它们是如何工作的。 如果我在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.

1 个答案:

答案 0 :(得分:0)

创建视图时,播放器将附加到视图,而不是相反。因此,我认为您最好的选择是将玩家移动到单身并启动/停止他,无论活动生命周期如何。当然你可以在后台线程上关闭(我建议你阅读线程池和执行器,因为我很少在android上看到 Thread.start()

也:

  

ViewGroup viewGroup =(ViewGroup)this.findViewById(R.id.tpPlayer);           viewGroup.removeView(涤气器);           scrubber = null;

这是不必要的。