【问题标题】:Android mediaPlayer not being correctly releasedAndroid mediaPlayer 未正确发布
【发布时间】:2015-10-02 12:57:42
【问题描述】:

我正在尝试通过单击按钮在 android 小部件中播放声音,这是我当前的代码:

@Override
public void onReceive(Context context, Intent intent) {
    Boolean hasToPlayMedia = false;
    MediaPlayer mediaPlayer = new MediaPlayer();
    if (intent.getAction().equals("somevalue")) {
        mediaPlayer = MediaPlayer.create(context, R.raw.somevalue);
        hasToPlayMedia = true;
    // OTher conditionals here
    }
    if (hasToPlayMedia) {
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.start();
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.stop();
                mp.reset();
                mp.release();
                mp = null;
            }
        });
    }
    super.onReceive(context, intent);
}

但是,在控制台中我读到:

E/MediaPlayer﹕ Should have subtitle controller already set
W/MediaPlayer-JNI﹕ MediaPlayer finalized without being released

有时单击按钮后一段时间后不会播放声音。

【问题讨论】:

    标签: android widget android-widget android-mediaplayer


    【解决方案1】:

    您必须在类内部和方法范围之外保留对 MediaPlayer 的静态引用。否则,操作系统可能会清理其资源,然后当您尝试从 onCompletion() 方法内部访问它时,它将处于非法状态。

    【讨论】:

    • 同样的事情,似乎每次都会重新实例化该类,如果我将其设置为类变量,则在第二次点击时(在第一次执行期间,因此在 OnCompletionListener 为空 mediaPlayer 之前)该变量为 null已经
    • 我最终使用了静态变量,请在答案中说明
    • 当然。例如,如果您在活动之间传递,例如调用活动的 onDestroy(),那么非静态的全局变量也将被清除。如果它是在整个应用程序中使用的 MediaPlayer,您可能希望将其保存在项目的 Application 类中,或者保存在所有活动的基类中(作为静态全局变量)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    相关资源
    最近更新 更多