HandlerThread.getLooper()无限期地阻塞

时间:2014-08-02 09:30:15

标签: java android multithreading android-handlerthread android-looper

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

在下面的示例中,getLooper()无限期地阻塞。我不知道为什么。有人可以告诉我如何修改下面的代码来解决这个问题吗?

此外,关于如何发送导致调用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();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

在MediaPlayerThread上你需要调用super方法来运行:

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

重要的事情在其父类运行方法中执行。更具体地说,创建了looper,如果你调用getLooper()并且没有创建looper,它将等待它的创建。

答案 1 :(得分:0)

来自HandlerThread.getLooper()的javadoc:

  

如果此线程已启动,则此方法将一直阻塞,直到looper已初始化为止。

要初始化循环器,您需要从循环器的线程中调用Looper.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()会为你做这件事。