java - 无法在未调用 Looper.prepare() Android Media Player 的线程内创建处理程序

标签 java android

我只是想通过媒体播放器播放音乐 n 秒。

public void playMusic(String music_path) {
    MediaPlayer mMediaPlayer = new MediaPlayer();

    try {
        mMediaPlayer.setDataSource(music_path);
        mMediaPlayer.prepare();
        mMediaPlayer.start();
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                mMediaPlayer.stop();
            }
        }, 20000);
        mMediaPlayer.release();
        Log.i(TAG, "Done Playing");
    } catch (IOException e) {
        e.printStackTrace();
    }
    return;
}

主文件中的我的函数调用者:

public void Play_Music() {
        mBtTestUtils.playMusic(MUSIC_PATH);
    }
}

当我这样做时,我收到以下错误:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

如有任何帮助,我们将不胜感激。

最佳答案

您需要先调用Looper.prepare()。您在处理程序上发布的任何内容都会进入消息队列。 Looper 会循环这个消息队列并发送任务来执行。每当定义一个新的 Handler 时,它都会获取定义它的线程的 Looper。新生成的线程不包含自己的 Looper,除非您调用 Looper.prepare(),因此会出现错误。 你可以得到很好的解释here .

关于java - 无法在未调用 Looper.prepare() Android Media Player 的线程内创建处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45417016/

相关文章:

java - 重绘()不工作

java - 如何从应用内浏览器打开 PDF 文件?

android - 在android中更改选定的 ListView 项目图像问题

java - 现在 Handler() 已被弃用,我该使用什么?

java - 如何将 AbstractContextLoaderInitializer 包含到我的 mvc 测试执行中?

java - 在类 com.potenza_pvt_ltd.AAPS.TruckDetailsActivity 上找不到车辆类型的 setter /字段

Java ASCII 迷宫

java - 定义单个线程的最大堆大小

android - 是否可以在 Cordova Android 上的 WebMidi 中使用 SysEx 消息?

java - Android 2.1 SDK + ConcurrentHashMap$ValueIterator 与 GC