【问题标题】:On back, kill activity without delaying main thread在后面,在不延迟主线程的情况下终止活动
【发布时间】: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


    【解决方案1】:

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

    还有:

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

    这是不必要的。

    【讨论】:

    • 不一定要在 UI 线程上,我尝试将其移至新线程,但似乎没有任何影响,我是 java/android 新手,所以我我很可能只是做错了
    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多