handlerthread . getloop()无限期阻塞



我正在学习如何在自己的线程中运行MediaPlayer,使用HandlerThread。但我第一步就失败了。我花了2天时间痛苦地试图理解Java/Android线程,真的需要一些帮助。(我读了无数的例子和javadoc页面,包括Java和Android),我感到非常沮丧/愚蠢。

在下面的例子中,getloop()无限阻塞。我也不知道为什么。请有人告诉我如何修改下面的代码来解决这个问题?

此外,如何发送消息导致MediaPlayer的方法被调用(异步)的例子将是非常有价值的,可能节省我一个星期。

谢谢

public class HandlerThreadExample {
    private MediaPlayerThread mMpThread;
    private Looper mMptLooper;
    private Handler mMptHandler;
    public HandlerThreadExample(){
        mMpThread = new MediaPlayerThread();
        mMpThread.start();
        mMptLooper = mMpThread.getLooper(); // everything freezes here
    }
    public void setMediaPlayerDataSource(Uri uri){
        // send message that calls mMediaPlayer.setDataSource(uri);
    }
    public void prepareMediaPlayer(){
        // send message that calls mMediaPlayer.prepare();
    }
    public void startMediaPlayer(){
        // send message that calls mMediaPlayer.start();
    }
    private class MediaPlayerThread extends HandlerThread {
        MediaPlayer mMediaPlayer;
        public MediaPlayerThread() {
            super("MediaPlayer Thread", HandlerThread.NORM_PRIORITY);
        }
        public void run (){
            mMediaPlayer = new MediaPlayer();
        }
    }
}

在MediaPlayerThread中你需要调用run的超级方法:

public void run (){
    mMediaPlayer = new MediaPlayer();
    super.run();
}

重要的东西在它的父类run方法中执行。更具体地说,循环被创建,如果你调用getloop()而循环没有被创建,它将等待它的创建。

从handlerthread . getloop()的javadoc:

如果这个线程已经启动,这个方法将阻塞直到循环器初始化。

要初始化循环器,你需要从循环器的线程中调用loop .prepare() (即意味着从run()方法中)

那么在你的代码中这样做:

private class MediaPlayerThread extends HandlerThread {
    MediaPlayer mMediaPlayer;
    public MediaPlayerThread() {
        super("MediaPlayer Thread", HandlerThread.NORM_PRIORITY);
    }
    public void run (){
        Looper.prepare();
        mMediaPlayer = new MediaPlayer();
    }
}

正如@eldjon所提到的:调用super.run()将为您完成此操作。

相关内容

  • 没有找到相关文章

最新更新